内置HTTP模块
Node.js 中有 HTTP 这个内置模块,HTTP 模块允许 Node.js 通过超文本传输协议(HTTP)传输数据。
如果要使用 HTTP 模块,需要先通过 require() 方法引入 HTTP 模块,如下所示:
var http = require('http');
简单服务器的创建
Node.js 中的 HTTP 模块可以创建一个 HTTP 服务器,该服务器侦听服务器端口并将响应返回给客户端。
示例:
使用createServer()方法创建HTTP服务器,如下所示:
var http = require('http'); http.createServer(function (req, res) { res.write('Hello xkd'); res.end(); }).listen(8888);
在命令工具中启动 Node.js 文件(你自定义的文件名),打开浏览器,访问http://127.0.0.1:8888/,就可以看到浏览器页面中会显示”Hello xkd“,这样一个最简单的服务器搭建成功了。
Node.js 中的 HTTP 模块中封装了一个 HTTP 服务器和一个简单的 HTTP 客户端,http.Server 是一个基于事件的 HTTP 服务器,http.request 则是一个 HTTP 客户端工具,用于向 HTTP 服务器发起请求。createServer() 方法中的两个参数 req 和 res 分别代表了请求对象和响应对象。其中 req 是 http.IncomingMessage 的实例,res 是 http.ServerResponse 的实例。
HTTP服务器
除了可以使用 createServer() 方法返回一个 http.Server 对象来创建服务器,我们还可以使用下列方法来实现。
示例:
创建一个http.Server对象,然后为其添加request事件监听:
var http = require("http"); var server = new http.Server(); server.on("request",function(req,res){ res.writeHead(200,{ "content-type":"text/plain; charset=utf-8" }); res.write("xkd"); res.end(); }); server.listen(8888);
http.Server的事件
http.Server 是一个基于事件的服务器,继承自 EventEmitter。http.Server 提供的事件如下所示:
- request:当客户端请求到来时,该事件被触发,提供两个参数req和res,表示请求和响应信息,是最常用的事件。
- connection:当TCP连接建立时,该事件被触发,提供一个参数socket,是net.Socket的实例。
- close:当服务器关闭时,触发事件(注意不是在用户断开连接时)。
HTTP客户端
http 模块提供了两个函数 http.request 和 http.get,功能是作为客户端向 http 服务器发起请求。
http.request(option,callback)
http.request() 方法接受两个参数,其中参数 option 是一个类似关联数组的对象,表示请求的参数。callback 是请求的回调函数,需要传递一个参数。
示例:
var http=require('http'); var querystring=require('querystring'); //启动服务 http.createServer(function(req,res){ console.log('开始请求,解析参数'); //解析post请求 var post=''; req.on('data',function(chunk){ post+=chunk; }); req.on('end',function(){ post=querystring.parse(post); //解析完成 console.log('参数解析完成,返回name参数'); res.end(post.name); }); }).listen(8888); //客户端请求 var contents=querystring.stringify({ name:'Tom', age:18, city:'beijing' }); //声明请求参数 var options={ host:'localhost', path:'/', port:8888, method:'POST', headers:{ 'Content-Type':'application/x-www-form-urlencoded', 'Content-Length':contents.length } }; //发送请求 var req=http.request(options,function(res){ res.setEncoding('utf-8'); res.on('data',function(data){ console.log('后台返回数据'); console.log('name参数的值为:' + data); }) }); req.write(contents); //必须调用end() req.end();
然后启动 Node.js 文件,会输出如下内容:
> node file.js 开始请求,解析参数 参数解析完成,返回name参数 后台返回数据 name参数的值为:Tom
http.get(option,callback)
http.get() 方法是 http.request 方法的简化版,唯一区别只是 http.get 自动将请求方法设为了 GET 请求,同时不需要手动调用 req.end()。如果我们使用 http.request 方法时没有调用 end 方法,服务器将不会收到信息。
示例:
var http=require('http'); var url=require('url'); var util=require('util'); //启动服务 http.createServer(function(req,res){ console.log('开始请求,解析参数'); var params=url.parse(req.url,true); console.log('解析完成'); console.log(util.inspect(params)); console.log('向客户端返回name'); res.end(params.query.name); }).listen(8888); //客户端请求 var request=http.get({ host:'localhost', path:'/user?name=Tom&age=18&city=beijing', port:8888},function(res){ res.setEncoding('utf-8'); res.on('data',function(data){ console.log('服务端相应name值为:'+data); }) });
然后启动 Node.js 文件,会输出如下内容:
>node file.js 开始请求,解析参数 解析完成 Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: '?name=Tom&age=18&city=beijing', query: { name: 'Tom', age: '18', city: 'beijing' }, pathname: '/user', path: '/user?name=Tom&age=18&city=beijing', href: '/user?name=Tom&age=18&city=beijing' } 向客户端返回name 服务端相应name值为:Tom