深入浅析Nodejs的Http模块


Posted in NodeJs onJune 20, 2017

一、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://nodejs.cn/api/http.html

二、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模块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

NodeJs 相关文章推荐
nodejs批量修改文件编码格式
Jan 22 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
ubuntu编译nodejs所需的软件并安装
Sep 12 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
NodeJS实现视频转码的示例代码
Nov 18 NodeJs
nodejs分离html文件里面的js和css的方法
Apr 09 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 #NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 #NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 #NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 #NodeJs
详解Nodejs之npm&amp;package.json
Jun 15 #NodeJs
详解nodejs模板引擎制作
Jun 14 #NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 #NodeJs
You might like
php获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
php发送http请求的常用方法分析
2016/11/08 PHP
PHP实现根据数组某个键值大小进行排序的方法
2018/03/13 PHP
js的event详解。
2006/09/06 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
在JavaScript中查找字符串中最长单词的三种方法(推荐)
2021/01/18 Javascript
[26:21]浴火之凤-TI4世界冠军Newbee战队纪录片
2014/08/07 DOTA
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
西式婚礼证婚词
2014/01/12 职场文书
门前三包责任书
2014/04/15 职场文书
群众路线对照检查材料
2014/09/22 职场文书
2014年财政工作总结
2014/12/10 职场文书
小学大队干部竞选稿
2015/11/20 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
SpringBoot SpringEL表达式的使用
2021/07/25 Java/Android