深入理解Node.js的HTTP模块


Posted in Javascript onOctober 12, 2016

前言

我们知道传统的HTPP服务器会由Aphche、Nginx、IIS之类的软件来担任,但是nodejs并不需要,nodejs提供了http模块,自身就可以用来构建服务器,而且http模块是由C++实现的,性能可靠。其中封装了一个高校的HTTP服务器和一个简单的HTTP客户端。http.Server是一个基于事件的HTTP服务器;http.request则是一个HTTP客户端工具,用于向HTTP服务器发送请求,实现内容抓取。

一. HTTP服务器

http.Server提供一套封装级别很低的API,仅仅是流控制和简单的消息解析。

可以使用http.CreateServer()来创建一个http.Server实例。

var http = require('http');

http.createServer(function (request, response){
 response.writeHead(200, {'Content-Type': 'text/html'});
 response。write("Server start!");
 response.end('Hello World\n');
}).listen(8080, "127.0.0.1");

console.log('Server running on port 8080.');

http.createServer创建了一个http.Server实例,将一个函数作为HTTP请求处理函数。这个函数接受两个参数,分别是请求对象(req)和响应对象(res)。

二. http.ServerRequest

http.ServerRequest是HTTP请求信息。一般由http.Server的request事件发送,作为第一个参数传递。

HTTP请求一般分为两部分:请求头和请求体。

http.ServerRequest提供了以下3个事件用于控制请求体传输。

     (1) data:当请求体数据到来时,该事件被触发。该事件提供一个参数trunk,表示接收到的数据。如果该事件没有被监听,那么请求体将会被抛弃;

     (2) end:当请求体数据传输完成时触发;

     (3) close:用户当前请求结束时触发。

ServerRequest的属性

深入理解Node.js的HTTP模块

三. 获取GET请求内容

http.ServerRequest提供的属性没有类似于PHP语言中的$_GET或$_POST的属性,那我们该如何接受客户端的表单请求呢?由于GET请求直接被嵌入在路径中,因此可以手动解释后面的内容作为GET请求的参数。

实例:

var http = require("http");
var url = require("url");
var util = require("util");

http.createServer(function(req, res) {
 res.writeHead(200, {"Content-Type": "text/html"});
 res.end(util.inspect(url.parse(req.url, true)));
}).listen(3000);

在浏览器中访问http://127.0.0.1:3000/?name=deng&age=22,返回结果如下:

Url { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, 
 search: '?name=deng&age=22', 
 query: { name: 'deng', age: '22' }, pathname: '/', 
 path: '/?name=deng&age=22', href: '/?name=deng&age=22' }

通过url.parse,原始的path被解释为一个对象,其中query就是请求的内容。

四. 获取POST请求内容

POST请求的全部内容都在请求体中。

五. http.ServerReponse

http.ServerReponse是返回给客户端的信息,决定了用户最终能看到的结果,一般作为http.createServer(function(req, res) {})函数中的res参数传递。

http.ServerReponse有三个重要的成员函数,用于返回响应头、响应内容以及结束请求。

response.writeHead(statusCode, [headers]) :向请求的客户端发送响应头。statusCode是HTTP状态码,headers是一个表示响应头属性的对象;

response.write(data, [encoding]) :向请求的客户端发送相应内容。data表示要发送的内容,encoding表示编码方式(默认是utf-8);

response.end([data], [encoding]) :结束响应,告知客户端所有发送已经完成。当所有要返回的内容发送完毕的时候,该函数必须被调用一次。如果不调用该函数,客户端将永远处于等待状态。

六. HTTP客户端

http模块提供了两个函数http.request和http.get,作为客户端想HTTP服务器发起请求。

1. http.request()

http.request(options, callback)发起HTTP请求。

其中options的常用参数如下:

     host:请求网站的域名或IP地址;

     port:请求网站的端口,默认是80;

     method:请求方法,默认是GET;

     path:请求的相对于根的路径,默认是”/”;

     headers:请求头的内容;

var http = require("http");
var querystring = require("querystring");

var contents = querystring.stringify({
  name: "deng",
  age: 22
});

var options = {
  host: "dengzhr.com",
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    "Content-Length": contents.length
  }
};

var req = http.request(options, function(res) {
  res.setEncoding("utf8");
  res.on("data", function(data) {
    console.log(data);
  });
});

req.write(contents);
req.end();

在发送POST请求时,一定不要忘记通过req.end()结束请求,否则服务器将不会收到消息。

2. http.get()

http.get(options, callback)是http模块的用于处理GET请求的更加简便的方法。不需要手动调用req.end()

实例:

var http = require("http");

http.get({host: "dengzhr.com"}, function(res) {
 res.setEncoding("utf8");
 res.on("data", function(data) {
  console.log(data);
 });
});

总结

以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
Prototype Hash对象 学习
Jul 19 Javascript
js操作select控件的几种方法
Jun 02 Javascript
jQuery中绑定事件的命名空间详解
Apr 05 Javascript
javascript学习笔记(十四) window对象使用介绍
Jun 20 Javascript
javascript的变量、传值、传址、参数之间关系
Jul 26 Javascript
jquery密码强度校验
Dec 02 Javascript
JS一个简单的注册页面实例
Sep 05 Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
小程序日历控件使用方法详解
Dec 29 Javascript
JS/jQuery实现简单的开关灯效果【案例】
Feb 19 jQuery
JavaScript 中for/of,for/in 的详细介绍
Nov 17 Javascript
纯js实现手风琴效果代码
Apr 17 #Javascript
JavaScript 继承详解(六)
Oct 11 #Javascript
JavaScript 继承详解(五)
Oct 11 #Javascript
Javascript动画效果(4)
Oct 11 #Javascript
JavaScript中const、var和let区别浅析
Oct 11 #Javascript
对javascript继承的理解
Oct 11 #Javascript
Javascript动画效果(3)
Oct 11 #Javascript
You might like
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
2020/09/21 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
python 简单的多线程链接实现代码
2016/08/28 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
Python如何生成树形图案
2018/01/03 Python
python Pexpect 实现输密码 scp 拷贝的方法
2019/01/03 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
python join方法使用详解
2019/07/30 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
AT&T Wireless:手机、无限数据计划和配件
2018/06/03 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
大学生求职工作的自我评价
2014/02/13 职场文书
太太口服液广告词
2014/03/20 职场文书
租车协议书范本
2014/04/22 职场文书
秋天的怀念教学反思
2014/04/28 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
司机个人年终总结
2015/03/03 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
2016年敬老月活动总结
2016/04/05 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书