任何可使用JavaScript来编写的应用,最终会由JavaScript编写。--Atwood's Lawnode
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)
像上面同样使用的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继承自 net.Server,http.Server提供的事件以下:函数
正如上面咱们所看到的request事件是最经常使用的,而参数req和res分别是http.IncomingMessage和http.ServerResponse的实例,那么咱们来看看这两个类ui
在server端:获取请求发送方的信息,好比请求方法、路径、传递的数据等。
在client端:获取 server 端发送过来的信息,好比请求方法、路径、传递的数据等。编码
http.IncomingMessage实例 有三个属性须要注意:method、statusCode、statusMessage。url
而且其提供了3个事件,以下code
http.ServerResponse 的做用很明确,服务端经过http.ServerResponse 实例,来个请求方发送数据。包括发送响应表头,发送响应主体等。它决定了用户最终看到的内容,通常也由http.Server的request事件发送,并做为第二个参数传递,它有三个重要的成员函数,用于返回响应头、响应内容以及结束请求
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.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 和已传输的主体的长度是否相等。
请求继承自流,且额外实现如下内容: