深入浅析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中exports与module.exports的区别详细介绍
Jan 14 NodeJs
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
Nov 18 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
NodeJs基本语法和类型
Feb 13 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
Nodejs模块的调用操作实例分析
Dec 25 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 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中JSON数据操作
2015/07/01 PHP
Thinkphp实现自动验证和自动完成
2015/12/19 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
JS实现可改变列宽的table实例
2013/07/02 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
Element DateTimePicker日期时间选择器的使用示例
2020/07/27 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
浅析Python编写函数装饰器
2016/03/18 Python
Tensorflow简单验证码识别应用
2017/05/25 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
瑞典首都斯德哥尔摩的多元奢侈时尚品牌:Acne Studios
2017/07/09 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
世界上最大的艺术社区:SAA
2020/12/30 全球购物
软件毕业生个人鉴定
2014/03/03 职场文书
讲座主持词
2014/03/20 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
违纪检讨书
2015/01/27 职场文书
志愿者个人总结
2015/03/03 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
同学聚会致辞集锦
2015/07/28 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
MySQL分库分表详情
2021/09/25 MySQL
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技