欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入浅析Nodejs的Http模块

程序员文章站 2022-06-24 17:08:27
一、http服务器     我们知道传统的http服务器是由aphche、nginx、iis之类的软件来搭建的,但是nodejs并不需要,n...

一、http服务器

    我们知道传统的http服务器是由aphche、nginx、iis之类的软件来搭建的,但是nodejs并不需要,nodejs提供了http模块,自身就可以用来构建服务器,例如:

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模块中封装了一个http服务器和一个简易的http客户端:http.server()用于创建是一个基于事件的http服务器,而http.request()和http.get()可以作为客户端向http服务器发起请求。在这里使用的createserver()方法返回了一个http.server对象,text/plain的意思是将文件设置为纯文本格式,浏览器在获取到这种文件时并不会对其进行处理,如果将content-type设置为text/html,浏览器在获取到这种文件时会自动调用html的解析器对文件进行相应的处理。另外,也可以用new http.server()构造函数的方法创建http.server对象,例如:

var http = require("http");
var server = new http.server();
server.on("request",function(req,res) {
  ...
}).listen(3000);

以上代码是通过直接创建一个http.server对象,然后为其添加request事件监听。使用createserver()方法创建的http.server对象默认添加了一个request事件监听,但是省略了。

上面说到了http.server的事件,http.server最常用的事件是"request",当接收到http请求时触发。在"request"事件中,传入回调函数的参数req和res分别是http.incomingmessage和http.serverresponse的实例:

http.incomingmessage类包含了从客户端发来的http请求信息,它可以用来访问响应状态、消息头、以及数据等,例如:

*headers/<object> - 请求头或响应头的对象
*httpversion/<string> - http协议版本,可能的值有"1.1"或"1.0"
*method/<string> - 请求的方法,例如"get"、"post"等
*statuscode/<number> - http响应状态码
*statusmessage/<string> - http响应状态消息
*url/<string> - 发送http请求的客户端的url

http.serverresponse类是返回给客户端的信息,它有三个重要的方法,用于返回响应头、响应内容以及结束请求:

writehead(statuscode[, statusmessage][,headers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头

write(chunk[,encoding][,callback]):向请求的客户端发送响应内容,chunk是一个buffer或者字符串,如果chunk是字符串,则需要指定编

码方式,默认为utf-8,在end()方法调用之前可以多次调用

end([data][,encoding][,callback]):结束响应,告知客户端所有发送已经结束,如果不调用这个函数,客户端将一直处于等待状态

其他http.server类的事件可以参考官方文档:

二、http客户端

http模块提供了http.request()和http.get()两个方法,功能是作为客户端向http服务器发起请求。

http.request(options[,callback])方法
http.request()方法返回一个http.clientrequest的实例。其中,options是一个对象,表示请求的参数。包括:
*protocol/<string> - 使用的协议,默认为http
*host/<string> - 请求发送至的服务器的域名或 ip 地址,默认为"localhost"
*hostname/<string> - host的别名
*port/<number> - 远程服务器的端口号,默认为80
*method/<string> - 指定http请求方法,默认为"get"
*path/<string> - 请求相对于根的路径,默认是"/",querystring应该包含在其中。例如:/index.html?page=12
*headers/<object> - 包含请求头的对象
*timeout/<number> - 它设置了 socket 等待连接的超时时间

例如:

var http = require("http");
var querystring = require("querystring");
var postdata = querystring.stringify({
  "content":"测试一下",
  "mid":8837
});
var options = {
  hostname:"www.imooc.com",
  port:80,
  path:"/course/document",
  method:"post",
  headers:{
    "accept":"application/json, text/javascript, */*; q=0.01",
    "accept-encoding":"gzip, deflate",
    "accept-language":"zh-cn,zh;q=0.8",
    "connection":"keep-alive",
    "content-length":postdata.length,
    "content-type":"application/x-www-form-urlencoded; charset=utf-8",
    "cookie":"",
    "host":"www.imooc.com",
    "origin":"http://www.imooc.com",
    "referer":"http://www.imooc.com/video/8837",
    "user-agent":"mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/53.0.2763.0 safari/537.36",
    "x-requested-with":"xmlhttprequest",
  }
}
var req = http.request(options,function(res){
  res.on("data",function(chunk){
    console.log(chunk);
  });
  res.on("end",function(){
    console.log("完毕!");
  });
  console.log(res.statuscode);
});
req.on("error",function(err){
  console.log(err.message);
})
req.write(postdata);
req.end();

如果请求过程中遇到任何错误,则在返回的请求对象中会触发"error"事件;

使用http.request()必须总是调用req.end()来表明请求的结束,即使没有数据被写入主体

http.get(options[,callback])方法

http.get()方法是http.request()方法的简化版,主要区别是http.get()自动将请求方法设为了"get"请求,同时不需要手动调用req.end()

以上所述是小编给大家介绍的nodejs的http模块,希望对大家有所帮助