深入理解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 相关文章推荐
使用EXT实现无刷新动态调用股票信息
Nov 01 Javascript
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
javascript数组操作方法小结和3个属性详细介绍
Jul 05 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
javascript实现博客园页面右下角返回顶部按钮
Feb 22 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
js实现select二级联动下拉菜单
Apr 17 Javascript
AngularJS入门教程之Scope(作用域)
Jul 27 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
laypage.js分页插件使用方法详解
Jul 27 Javascript
json字符串对象转换代码实例
Sep 28 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 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(2)――PHP类型
2010/02/15 PHP
memcached 和 mysql 主从环境下php开发代码详解
2010/05/16 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP递归调用的小技巧讲解
2013/02/19 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
JS兼容浏览器的导出Excel(CSV)文件的方法
2014/05/03 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
seajs模块之间依赖的加载以及模块的执行
2016/10/21 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
JS作用域链详解
2017/06/26 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
2017/11/28 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
Node.js 多线程完全指南总结
2019/03/27 Javascript
vue多页面项目中路由使用history模式的方法
2019/09/23 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
Python netmiko模块的使用
2020/02/14 Python
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
古驰英国官网:GUCCI英国
2020/03/07 全球购物
2014年宣传部工作总结
2014/11/12 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
班组长如何制订适合本班组的工作计划?
2019/07/10 职场文书