概念:Node.js提供了http模块。当中封装了一个高效的HTTPserver和一个简单的HTTPclient。

    http.server是一个基于事件的HTTP服务器。内部用C++实现。接口由JavaScript封装。

    http.request则是一个HTTPclient工具。用户向server发送请求。

一、HTTPserver

    http.Server实现的,它提供了一套封装级别非常低的API,不过流控制和简单的解析,全部的高层功能都须要通过它的接口

    前面解说的app.js案例

    代码分析:

    http.createServer创建了一个http.Server的实例,将一个函数作为HTTP请求处理函数。这个函数接受两个參数,请求对象req和响应对象的res。

    res显式写入了响应代码200(表示请求成功),指定响应头,写入响应体。调用end结束并发送。该实例调用listen函数,启动server并监听3000port。

  1.http.Server的事件

    http.Server是一个基于事件的HTTPserver,全部请求都被封装到独立的事件,开发人员仅仅要对它的事件编写对应的函数就可以实现HTTPserver的全部功能,

    它继承与EventEmitter,提供了下面事件:

        request:当client请求到来时,该事件被触发,提供两个參数req和res,各自是http.ServerRequest和http.ServerResponse的实例,表示请求和响应信息。

        connection:当TCP连接建立时,该事件被触发,提供一个參数socket,为net.Socket的实例(底层协议对象)。

        close:当server关闭时,该事件被触发。

    除此之外还有checkContinue、upgrade、clientError事件。

    最经常使用和关心的是:request事件,http提供了一个捷径,http.createServer([requestListener])

    显式实现方法:

    案例:server.js

    var http = require('http');

    var server = new http.Server();

    server.on('request',function(req,res){

        res.writeHead(200,{'Content-Type':'text/html'});

        res.write('<h1>NODE.JS</h1>');

        res.end('<p>hello,world</p>');

    });

    server.listen(3000);

  2.http.ServerRequest请求的信息

    此对象是后端开发人员最关注的内容,它一般由http.Server的request对象发送,作为第一个參数传递,通常简写成request或req。

    HTTP请求分为两部分:请求头和请求体。,请求内容短的直接在请求头解析完毕后马上读取,而请求体可能相对较长,须要一定的时间传输,因此提供了3个事件用于控制请求体传输。

    (1)data:当请求体数据到来时,该事件被触发,该事件一共一个參数chunk,表示接受到的数据。

    (2)end:当请求体传输数据完毕时,该事件被触发,此后将不会再有数据到来。

    (3)close:用户当前请求结束时,该事件被触发,不同于end,假设用户强制终止了传输,也会触发close

        ServerReuqest的属性

            complete:client请求是否已经发送完毕

            httpVersion   HTTP协议版本号,一般是1.0或1.1

            method        HTTP请求方法,如:GET,POST

            url           原始的请求路径,比如/pc/getUser或/user?name=marico

            headers       HTTP请求头

            trailers      HTTP请求尾(不常见)

            connection    当前HTTP连接套接字,为net.Socket的实例

            socket        connection属性的别名

            client        client属性的别名

  3.获取GET请求内容

    因为GET请求直接被嵌入在路径中,URL完整的请求路径,包含了?后面的部分,因此你能够手动解析后面的内容作为GET的參数,Nodejs的url模块中的parse函数提供了这个功能

    实例:get.js

 var http=require('http');

        var urls=require('url');

     var util=require('util');

http.createServer(function(req,res){

         res.writeHead(200,{'Content-Type':'text/plain'});

        res.end(util.inspect(urls.parse(req.url,true)));

 }).listen(3000);

  4.获取POST请求内容

    POST请求的内容所有都在请求体中,http.ServerRequest并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。譬如上传文件。

    恶意的POST请求会大大消耗server的资源。所以Nodejs是不会解析请求体,当你须要的时候,须要手动来做。

    实例:post.js

    var http=require('http');

    var querystring=require('querystring');

    var util=require('util');

    http.createServer(function(req,res){

        var post='';

        //注冊data事件监听函数,每当接受请求体的数据

        req.on('data',function(chunk){

            post+=chunk;

        });

        req.on('end',function(){

     //解析成字符串格式的post为真正的post请求格式

     post=querystring.parse(post);

     //向前端返回

     res.end(util.inspect(post));

        });

    }).listen(3000);

  5.http.ServerResponse返回给client的信息

    决定了用户终于能到的结果,它是由http.Server的reponse对象发送的,作为第二个參数传递。一般为response或res

    基本的三个函数:

    response.writeHead(statusCode,[headers]):向请求的client发送响应头。

    statusCode是HTTP的状态码,如200为成功,404未找到等。

    headers是一个类似关联数组的对象,表示响应头的每一个属性。

    response.write(data,[encoding]) 向请求client发送对应内容,data是buffer或字符串,encoding为编码

    response.end([data],[encoding]) 结束响应,告知用户全部发送已经完毕,当全部要返回的内容发送完毕,该函数必须被调用一次,假设不调用,client永远处于等待状态

node.js第十课(HTTPserver)的更多相关文章

  1. node.js之十大Web框架

    之前接触过Node.js是因为好奇大前端越来越能干了,连我后台的饭碗都要抢了,太嚣张了,于是我想打压打压它,然后就这样接触它了.再到后来是因为Settings-Sync插件二次开发,我需要用node. ...

  2. Node.js实战(十)之EventEmitter

    Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列. Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs. ...

  3. Node.js实战(十二)之Stream

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出). Node.js,Str ...

  4. vue.js 第十课-第十六课

    第十课: http://note.youdao.com/noteshare?id=25b5ba45286464856f21eb4b6b391ecd&sub=19C4429995384F72BD ...

  5. node.js第11课(HTTPclient)

     一.http模块提供了两个函数http.request和http.get,功能是作为client向HTTPserver发起请求.     Ext.Ajax.request({},function ...

  6. 使用Node.js 搭建http服务器 http-server 模块

    1. 安装 http-server 模块 npm install http-server -g   全局安装 2.在需要的文件夹   启动 http-server  默认的端口是8080    可以使 ...

  7. 让我欲罢不能的node.js

    从我大一接触第一门编程语言C开始,到现在工作三年陆续接触到了C.汇编.C++.C#.Java.JavaScript.PHP,还有一些HTML.CSS神马的,从来没有一门语言让我像对node.js一样的 ...

  8. 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

    twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...

  9. 十款最佳Node.js MVC框架

    十款最佳Node.js MVC框架摘要:Node.js是JavaScript中最为流行的框架之一,易于创建可扩展的Web应用.本文分享十款最佳的JavaScript框架. Node.js是JavaSc ...

随机推荐

  1. iOS面试题02-数据存储

    1.如果后期需要增加数据库中的字段怎么实现,如果不使用CoreData呢? 回答:编写SQL语句来操作原来表中的字段 1>增加表字段 ALETER TABLE 表名 ADD COLUMN 字段名 ...

  2. struts2入门

    好久没有动博客了.今天看了一下慕课网的视频,简单了解一下struts2. 首先是在项目中引入struts2的文件,有一个比较简单的方法就是可以直接右键项目MyEclipse->Project f ...

  3. p95 3.5、3.8

    3.5  有一农夫带一条狼,一只羊和一筐菜欲从河的左岸乘船到右岸,但受下列条件限制:(1)船太小,农夫每次只能带一样东西过河:(2)如果没有农夫看管,则狼要吃羊,羊要吃菜.请设计一个过河方案,是的农夫 ...

  4. 简单的mvvm light 应用

      public  class MainStudentModel:ViewModelBase    { //实体        private StudentModel stu = new Stude ...

  5. css中z-index属性(标签层叠次序)

    定义和用法 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 注释:元素可拥有负的 z-index 属性值. 注释:Z-index 仅能在定位元素上奏 ...

  6. PHP新闻系统开发流程

    PHP新闻系统开发流程一.系统总体设计 (一)系统功能描述和功能模块划分 (二)系统流程分析 (三)系统所用文件二.数据库设计 (一)创建数据库 (二)设计表结构三.新闻发布模块开发 (一)新闻首页 ...

  7. R语言学习笔记之外部文件读取

    在win32位的系统下,RODBC包内的函数是可以直接运行的,但在win64位的系统则不支持! 1.读取外部文件read.table()---csv,txt,excel 最基本函数是read.tabl ...

  8. 【转】context和getApplicationContext()介绍

    在android中常常会遇到与context有关的内容,大多都是作为参数在传递,但是它的作用究竟是什么呢 先说它的用法,举个例子 在语句 AlertDialog.Builder builder = n ...

  9. yoeman构建Asp.net core项目并且实现分层

    在Mac上开发使用yoeman构建Asp.net core项目并且实现分层引用 1.Yoeman? yoeman是一个自动化脚手架工具.它提供很多generator,generator相当于Visua ...

  10. c++ cout 保留小数点位

    需要头文件 <iomanip> 输出时需要用 fixed 和 setprecision() fixed代表输出浮点数,setprecision()设置精度. #include <io ...