天天学点node系列-http

任何可使用JavaScript来编写的应用,最终会由JavaScript编写。--Atwood's Lawnode

http模块概览

http模块主要用于建立http server服务,而且web

  • 支持更多特性
  • 不缓冲请求和响应
  • 可以流式传输数据

借助http模块,能够几行代码就搞定一个超迷你的web server:服务器

var http=require("http")
http.createServer(function(req, res){
    res.writeHead(200,{
        "content-type":"text/plain"
    })
    res.write("hello nodejs")
    res.end()
}).listen(3000)

http服务器

像上面同样使用的createServer方法返回了一个http.Server对象,这实际上是一个建立http服务的捷径,若是咱们用如下代码来实现的话,也将同样可行异步

var http = require("http")
var server = new http.Server()
server.on("request", function(req, res){
        res.writeHead(200, {
        "content-type":"text/plain"
    })
    res.write("hello nodejs")
    res.end()
})
server.listen(3000)

以上代码是经过直接建立一个http.Server对象,而后为其添加request事件监听,其实也就说createServer方法其实本质上也是为http.Server对象添加了一个request事件监听。socket

http.Server的事件

http.Server继承自 net.Server,http.Server提供的事件以下:函数

  • request:当客户端请求到来时,该事件被触发,提供两个参数req和res,表示请求和响应信息,是最经常使用的事件
  • connection:当TCP链接创建时,该事件被触发,提供一个参数socket,是net.Socket的实例
  • close:当服务器关闭时,触发事件(注意不是在用户断开链接时)

正如上面咱们所看到的request事件是最经常使用的,而参数req和res分别是http.IncomingMessage和http.ServerResponse的实例,那么咱们来看看这两个类ui

http.IncomingMessage

在server端:获取请求发送方的信息,好比请求方法、路径、传递的数据等。
在client端:获取 server 端发送过来的信息,好比请求方法、路径、传递的数据等。编码

http.IncomingMessage实例 有三个属性须要注意:method、statusCode、statusMessage。url

  • method:只在 server 端的实例有(也就是 serverReq.method)
  • statusCode/statusMessage:只在 client 端 的实例有(也就是 clientRes.method)

而且其提供了3个事件,以下code

  • data:当请求体数据到来时,该事件被触发,该事件提供一个参数chunk,表示接受的数据,若是该事件没有被监听,则请求体会被抛弃,该事件可能会被调用屡次(这与nodejs是异步的有关系)
  • end:当请求体数据传输完毕时,该事件会被触发,此后不会再有数据
  • close:用户当前请求结束时,该事件被触发,不一样于end,若是用户强制终止了传输,也是用close

http.ServerResponse

http.ServerResponse 的做用很明确,服务端经过http.ServerResponse 实例,来个请求方发送数据。包括发送响应表头,发送响应主体等。它决定了用户最终看到的内容,通常也由http.Server的request事件发送,并做为第二个参数传递,它有三个重要的成员函数,用于返回响应头、响应内容以及结束请求

  • res.writeHead(statusCode,[heasers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,若是不调用,则会自动生成一个响应头
  • res.write(data,[encoding]):想请求的客户端发送相应内容,data是一个buffer或者字符串,若是data是字符串,则须要制定编码方式,默认为utf-8,在res.end调用以前能够屡次调用
  • res.end([data],[encoding]):结束响应,告知客户端全部发送已经结束,当全部要返回的内容发送完毕时,该函数必需被调用一次,两个可选参数与res.write()相同。若是不调用这个函数,客户端将用于处于等待状态。

http客户端

http模块提供了两个函数http.request和http.get,功能是做为客户端向http服务器发起请求。

var http = require('http')

// http server
var server = http.createServer(function(req, res){
    var url = req.url
    res.end( '您访问的地址是:' + url )
})

server.listen(3000)

// http client
var client = http.get('http://127.0.0.1:3000', function(res){
    res.setEncoding("utf-8")
    res.on("data",function(chunk){
        console.log(chunk.toString()) 
    })
    console.log(res.statusCode);
})

client.on("error",function(err){ 
    console.log(err.message)
})
client.end()

http.ClientRequest

此对象由 http.request() 内部建立并返回。 它表示正在进行的请求,且其请求头已进入队列。 请求头仍然可使用 setHeader(name, value)getHeader(name)removeHeader(name) 改变。 实际的请求头将与第一个数据块一块儿发送,或者当调用 request.end() 时发送。
要得到响应,则为请求对象添加 'response' 事件监听器。 当接收到响应头时,将、则会从请求对象触发 'response' 事件。 'response' 事件执行时有一个参数,该参数是 http.IncomingMessage 的实例。

'response' 事件期间,能够添加监听器到响应对象,好比监听 'data' 事件。

若是没有添加 'response' 事件处理函数,则响应将被彻底丢弃。 若是添加了 'response' 事件处理函数,则必须消费完响应对象中的数据,每当有 'readable' 事件时调用 response.read()、或添加 'data' 事件处理函数、或经过调用 .resume() 方法。 在消费完数据以前,不会触发 'end' 事件。 此外,在读取数据以前,它将占用内存,最终可能致使进程内存不足的错误。

Node.js 不检查 Content-Length 和已传输的主体的长度是否相等。

请求继承自流,且额外实现如下内容:

  • 'abort': 当请求被客户端停止时触发。 此事件仅在第一次调用 abort() 时触发。
  • 'timeout':当底层套接字因不活动而超时时触发。 这只会通知套接字已空闲。 必须手动停止请求。
  • ...
相关文章
相关标签/搜索