深入理解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 相关文章推荐
Javascript学习笔记5 类和对象
Jan 11 Javascript
utf-8编码引起js输出中文乱码的解决办法
Jun 23 Javascript
javascript用户注册提示效果的简单实例
Aug 17 Javascript
JavaScript作用域链使用介绍
Aug 29 Javascript
js跑步算法的实现代码
Dec 04 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
Feb 13 Javascript
js中DOM三级列表(代码分享)
Mar 20 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
详解微信小程序Page中data数据操作和函数调用
Sep 27 Javascript
原生js实现简单的焦点图效果实例
Dec 14 Javascript
jQuery UI实现动画效果代码分享
Aug 19 jQuery
纯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中邮箱地址正则表达式实现与详解
2012/04/24 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
CI框架入门之MVC简单示例
2016/11/21 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
Javascript Throttle & Debounce应用介绍
2013/03/19 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
window.opener用法和用途实例介绍
2013/08/19 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
web打印小结
2017/01/11 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
微信小程序签到功能
2018/10/31 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
js仿360开机效果
2019/12/26 Javascript
[46:57]EG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python3 socket同步通信简单示例
2017/06/07 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
python实现简易云音乐播放器
2018/01/04 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
华为c/c++笔试题
2016/01/25 面试题
自荐书格式
2013/12/01 职场文书
销售简历自我评价
2014/01/24 职场文书
《月迹》教学反思
2014/02/19 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
python脚本框架webpy的url映射详解
2021/11/20 Python
为什么MySQL8新特性会修改自增主键属性
2022/04/18 MySQL