深入浅析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中的非阻塞方法介绍
Jun 05 NodeJs
跟我学Nodejs(一)--- Node.js简介及安装开发环境
May 20 NodeJs
Nodejs极简入门教程(二):定时器
Oct 25 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
Mac 安装 nodejs方法(图文详细步骤)
Oct 30 NodeJs
Nodejs使用Mongodb存储与提供后端CRD服务详解
Sep 04 NodeJs
NodeJs入门教程之定时器和队列
Mar 08 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 disk_free_space 返回目录可用空间
2010/05/10 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP使用in_array函数检查数组中是否存在某个值
2015/03/25 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
js 判断脚本加载完毕的代码
2011/07/13 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
javascript与css3动画结合使用小结
2015/03/11 Javascript
JavaScript中使用Math.PI圆周率属性的方法
2015/06/14 Javascript
JavaScript实现对下拉列表值进行排序的方法
2015/07/15 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
用JS实现轮播图效果(二)
2016/06/26 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
简单了解Javscript中兄弟ifream的方法调用
2019/06/17 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
python实现ip查询示例
2014/03/26 Python
python机器学习之随机森林(七)
2018/03/26 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
中学生自我鉴定
2014/02/04 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
老员工辞职信范文
2015/05/12 职场文书
Django一小时写出账号密码管理系统
2021/04/29 Python