深入理解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 相关文章推荐
避免回车键导致的页面无意义刷新的解决方法
Apr 12 Javascript
JavaScript学习笔记(二) js对象
Oct 25 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
javascript抽象工厂模式详细说明
Dec 16 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
EasyUi combotree 实现动态加载树节点
Apr 01 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
Apr 17 jQuery
详解使用WebPack搭建React开发环境
Aug 06 Javascript
vue实现标签云效果的方法详解
Aug 28 Javascript
javascript单张多张图无缝滚动实例代码
May 10 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
纯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水印技术
2007/02/14 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
PHP中使用Memache作为进程锁的操作类分享
2015/03/30 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
Yii实现简单分页的方法
2016/04/29 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
JavaScript面向对象编程
2008/03/02 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
js只执行1次的函数示例
2016/07/20 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
你可能不知道的JSON.stringify()详解
2017/08/17 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
react-intl实现React国际化多语言的方法
2020/09/27 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
[38:27]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第二场 11.26
2020/11/30 DOTA
用Python实现一个简单的线程池
2015/04/07 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
python线程、进程和协程详解
2016/07/19 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python实现图片转字符小工具
2019/04/30 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
python中字符串的编码与解码详析
2020/12/03 Python
发现两个有趣的CSS3动画效果
2013/08/14 HTML / CSS
Roots加拿大官网:加拿大休闲服饰品牌
2016/10/24 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
如何获得EntityManager
2014/02/09 面试题
烹调加工管理制度
2014/02/04 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
企业趣味活动方案
2014/08/21 职场文书