深入理解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 相关文章推荐
jquery blockUI 遮罩不能消失与不能提交的解决方法
Sep 17 Javascript
JavaScript Array Flatten 与递归使用介绍
Oct 30 Javascript
jQuery load方法用法集锦
Dec 06 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
js canvas实现擦除动画
Jul 16 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
XMLHttpRequest Level 2 使用指南
Aug 26 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 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 在文件指定行插入数据的代码
2010/05/08 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
PHP多态代码实例
2015/06/26 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
extjs tabpanel限制选项卡数量实现思路及代码
2013/04/02 Javascript
PHP守护进程实例
2015/03/06 Javascript
JavaScript中消除闭包的一般方法介绍
2015/03/16 Javascript
jQuery获取checkboxlist的value值的方法
2015/09/27 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
动态加载js、css的实例代码
2016/05/26 Javascript
解析浏览器端的AJAX缓存机制
2016/06/21 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
详解Vue中的watch和computed
2020/11/09 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
python之Socket网络编程详解
2016/09/29 Python
django框架auth模块用法实例详解
2019/12/10 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
初中体育教学反思
2014/01/14 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
学校后勤工作总结2015
2015/05/15 职场文书