于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response,究竟是如何通过参数工作的,如果并发量大如何确保每个人访问和提交的数据不干扰等等。都没有教你具体如何在开发中使用,如何着手写代码,给你一个Event 'close',只说了下在服务器关闭时触发,完了。如果没有了解EventEmitter的核心事件,可能还真不知道如何抒写代码并在开发中真正使用。而http server创建的服务对象已经继承了EventEmitter,所以可以直接使用on进行监听即可。学学util包中的inherits是如何继承EventEmitter的就应该略知一二了。

在官方文档的API中有服务器对象和回调函数参数返回参数的对象,response和request对象各有两种不同。一种是server级别的一种是client级别的。

关于HTTP部分大致分为如下的重要点:

直接通过http对象使用的有:

一、http.STATUS_CODES

二、http.createServer

三、http.request(http.ClientRequest)

四、http.get

五、http.globalAgent

六、http.IcomingMessage

作为回调参数使用的对象有:

1.http.serverRequest

2.http.serverResponse

3.http.Agent

http: {STATUS_CODES: {'100': 'Continue','101': 'Switching Protocols','102': 'Processing','200': 'OK','201': 'Created','202': 'Accepted','203': 'Non-Authoritative Information','204': 'No Content','205': 'Reset Content','206': 'Partial Content','207': 'Multi-Status','300': 'Multiple Choices','301': 'Moved Permanently','302': 'Moved Temporarily','303': 'See Other','304': 'Not Modified','305': 'Use Proxy','307': 'Temporary Redirect','400': 'Bad Request','401': 'Unauthorized','402': 'Payment Required','403': 'Forbidden','404': 'Not Found','405': 'Method Not Allowed','406': 'Not Acceptable','407': 'Proxy Authentication Required','408': 'Request Time-out','409': 'Conflict','410': 'Gone','411': 'Length Required','412': 'Precondition Failed','413': 'Request Entity Too Large','414': 'Request-URI Too Large','415': 'Unsupported Media Type','416': 'Requested Range Not Satisfiable','417': 'Expectation Failed','418': 'I\'m a teapot','422': 'Unprocessable Entity','423': 'Locked','424': 'Failed Dependency','425': 'Unordered Collection','426': 'Upgrade Required','428': 'Precondition Required','429': 'Too Many Requests','431': 'Request Header Fields Too Large','500': 'Internal Server Error','501': 'Not Implemented','502': 'Bad Gateway','503': 'Service Unavailable','504': 'Gateway Time-out','505': 'HTTP Version Not Supported','506': 'Variant Also Negotiates','507': 'Insufficient Storage','509': 'Bandwidth Limit Exceeded','510': 'Not Extended','511': 'Network Authentication Required'}
}

测试用例:

var http = require('http');http.createServer(function(req,res){var status = req.url.substr(1);if( ! http.STATUS_CODES[status]){status = '404';}res.writeHeader(status,{'Content-Type':'text/plain'});res.end(http.STATUS_CODES[status]);
}).listen(3000);

测试连接:http://localhost:3000/500  结果输出 Internal Server Error

二、http.createServer

http.createServer是创建一台web服务器的关键所在,是处理请求和回应的主函数出口和出口,我们把http.createServer创建的服务对象定义为server.代码如下。

/*** Created by Administrator on 14-4-29.*/var http = require('http');/*** 创建服务器的两种写法,第一种写法如下* 由于server已经继承了EventEmitter的事件功能,所以可以使用高级函数编写方式监控事件* @param {Function} request event
*/
var server = http.createServer(function(req,res)
{//这里的req为http.serverRequestres.writeHeader(200,{'Content-Type':'text/plain'});res.end('hello world');
});/*** 说明:创建服务器的第二种写法* 有关server对象的事件监听* @param {Object} req 是http.IncomingMessag的一个实例,在keep-alive连接中支持多个请求* @param {Object} res 是http.ServerResponse的一个实例*/
var server = new http.Server();
server.on('request',function(req,res){res.writeHeader(200,{'Content-Type':'text/plain'});res.end('hello world');
});/*** 说明:新的TCP流建立时出发。 socket是一个net.Socket对象。 通常用户无需处理该事件。* 特别注意,协议解析器绑定套接字时采用的方式使套接字不会出发readable事件。 还可以通过request.connection访问socket。* @param {Object} socket*/
server.on('connection',function(socket){});/*** 源API: Event: 'close'* 说明:关闭服务器时触发*/
server.on('close',function(){});/*** 说明:每当收到Expect: 100-continue的http请求时触发。 如果未监听该事件,服务器会酌情自动发送100 Continue响应。* 处理该事件时,如果客户端可以继续发送请求主体则调用response.writeContinue, 如果不能则生成合适的HTTP响应(例如,400 请求无效)* 需要注意到, 当这个事件触发并且被处理后, request 事件将不再会触发.* @param {Object} req* @param {Object} req*/
server.on('checkContinue',function(req,res){});/*** 说明:如果客户端发起connect请求,如果服务器端没有监听,那么于客户端请求的该连接将会被关闭* @param {Object} req 是该HTTP请求的参数,与request事件中的相同。* @param {Object} socket 是服务端与客户端之间的网络套接字。需要自己写一个data事件监听数据流* @param {Object} head 是一个Buffer实例,隧道流的第一个包,该参数可能为空。*/
server.on('connect',function(req,socket,head){});/*** 说明:这个事件主要是对HTTP协议升级为其他协议后的事件监听,如果服务器端没有监听,那么于客户端请求的该连接将会被关闭* @param {Object} req 是该HTTP请求的参数,与request事件中的相同。* @param {Object} socket 是服务端与客户端之间的网络套接字。需要自己写一个data事件监听数据流* @param {Object} head 是一个Buffer实例,升级后流的第一个包,该参数可能为空。*/
server.on('upgrade',function(req,socket,head){});/*** 说明:如果一个客户端连接触发了一个 'error' 事件, 它就会转发到这里* @param {Object} exception* @param {Object} socket*/
server.on('clientError',function(exception,socket){});/*** 源API:server.listen(port, [hostname], [backlog], [callback])* 说明:监听一个 unix socket, 需要提供一个文件名而不是端口号和主机名。* @param {Number} port 端口* @param {String} host 主机* @param {Number} backlog 等待队列的最大长度,决定于操作系统平台,默认是511* @param {Function} callback 异步回调函数*/
//server.listen(3000,'localhost',100,function(){});/*** 源API:server.listen(path, [callback])* 说明:启动一个 UNIX 套接字服务器在所给路径 path 上监听连接。* 可能用处:多路径或渠道数据来源监听分隔* @param {String} path* @param {Function} callback*/
//server.listen('path',function(){})/*** 源API:server.listen(handle, [callback])* 说明:Windows 不支持监听一个文件描述符。* @param {Object} handle 变量可以被设置为server 或者 socket* @param {Function} callback*/
//server.listen({},function(){});/*** 说明:最大请求头数目限制, 默认 1000 个. 如果设置为0, 则代表不做任何限制.* @type {number}*/
server.maxHeadersCount = 1000;/*** 源API:server.setTimeout(msecs, callback)* 说明:为套接字设定超时值。如果一个超时发生,那么Server对象上会分发一个'timeout'事件,同时将套接字作为参数传递。* 设置为0将阻止之后建立的连接的一切自动超时行为* @param {Number} msecs* @param*/
server.setTimeout(1000,function(){});/*** 说明:一个套接字被判断为超时之前的闲置毫秒数。 默认 120000 (2 分钟)* @type {number}*/
server.timeout = 120000;/*** 说明:这里的主机将是本地* @param {Number} port 端口* @param {Function} callback 异步回调函数*/
server.listen(3000,function(){console.log('Listen port 3000');
});

三 、http.request

http 模块提供了两个函数 http.request 和 http.get,功能是作为客户端向 HTTP服务器发起请求。http.request(options, callback) 发起 HTTP 请求。接受两个参数,option 是一个类似关联数组的对象,表示请求的参数,callback 是请求的回调函数。option常用的参数如下所示。 http.request 返回一个 http.ClientRequest 的实例。

/*** Created by Administrator on 14-4-30.*/var http = require('http');var server = http.createServer(function(req,res){}).listen(3000);/*** 参数配置* @type {{hostname: string, port: number, method: string, path: string,handers: {}}}* host:请求的服务器域名或者IP地址* port:端口* method:请求方式有POST,GET,INPUT,DELETE,CONNECT,默认为GET* path:请求地址,可包含查询字符串以及可能存在的锚点。例如'/index.html?page=12'* handers: 一个包含请求头的对象。*/
var options =
{hostname : 'www.google.com',port : 80,method : 'POST',path : '/upload',handers:{}
};/*** 如下特别的消息头应当注意:* 发送'Connection: keep-alive'头部将通知Node此连接将保持到下一次请求。* 发送'Content-length'头将使默认的分块编码无效。* 发送'Expect'头部将引起请求头部立即被发送。* 通常情况,当发送'Expect: 100-continue'时,你需要监听continue事件的同时设置超时。参见RFC2616 8.2.3章节以获得更多的信息。*//*** 说明:官方给出的例子* 应用场景:模拟客服端请求服务器,是一个HTTP 客户端工具,用于向 HTTP 服务器发起请求。* @param {Object} options* @param {Function} callback*/
var req = http.request(options,function(res){console.log(res);console.log('STATUS:' + res.statusCode);console.log('HEADERS:' + JSON.stringify(res.headers));res.setEncoding('utf8');res.on('data',function(chunk){console.log('BODY' + chunk);});
});req.on('response',function(){});req.on('connect',function(){});req.on('socket',function(){});req.on('upgrade',function(){});req.on('continue',function(){})//如果在请求过程中出现了错误(可能是DNS解析、TCP的错误、或者HTTP解析错误),返回的请求对象上的'error'的事件将被触发。
req.on('error',function(e){console.log(e.message);
});/*** 源API:request.write(chunk, [encoding])* 说明:发送正文中的一块。用户可以通过多次调用这个方法将请求正文以流的方式发送到服务器。此种情况建议在建立请求时使用['Transfer-Encoding', 'chunked']请求头。* @param {Object or String} chunk 参数chunk应当是一个整数数组或字符串。* @param {String} encoding 参数encoding是可选的,仅在chunk为字符串时可用。*/
req.write('data\n');/*** 源API:request.end(chunk, [encoding])* 说明:完成本次请求的发送。如果正文中的任何一个部分没有来得及发送,将把他们全部刷新到流中。如果本次请求是分块的,这个函数将发出结束字符'0\r\n\r\n'。如果使用参数data,就等于在调用request.write(data, encoding)之后紧接着调用request.end()。* @param {Object or String} chunk 参数chunk应当是一个整数数组或字符串。* @param {String} encoding 参数encoding是可选的,仅在chunk为字符串时可用。* example: req.end(),req.end('data\n'),req.end('data','utf8'),req.end(chunk)*/
req.end();/*** 阻止一个请求。(v0.3.8中新增的方法。)*/
req.abort();/*** 源API:request.setTimeout(timeout, [callback])* 说明:一旦给这个请求分配的是一个socket时此函数会被调用* @param {Number} timeout 毫秒* @param {Function} callback 回到函数*/
req.setTimeout(1000,function(){});/*** 源API :request.setNoDelay([noDelay])* 说明:默认有一定的延迟,设置为0表示无延迟* @param {Number} noDelay*/
req.setNoDelay(0)
/*** 源API:request.setSocketKeepAlive([enable], [initialDelay])*     类似同上*/

四、http.get

http.get(options, callback) http 模块还提供了一个更加简便的方法用于处理GET请求:http.get。它是 http.request 的简化版,唯一的区别在于http.get自动将请求方法设为了 GET 请求,同时不需要手动调用 req.end()。

/*** Created by Administrator on 14-4-30.*/var http = require('http');http.createServer(function(req,res){}).listen(3000);/*** 说明:由于大部分请求是不包含正文的GET请求,Node提供了这个方便的方法。与http.request()唯一的区别是此方法将请求方式设置为GET,并且自动调用req.end()。* 应用:服务器端测试客服端请求调试等* @param {String} url 有效地址* @param {Function} callback*/
http.get('http://www.baidu.com/index.html',function(res){console.log('get response Code :' + res.statusCode);
}).on('error',function(e){console.log("Got error: " + e.message);})

 

转载于:https://www.cnblogs.com/huenchao/p/6224844.html

Node.js HTTP 使用详解相关推荐

  1. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 --持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  2. Node.js中Async详解

    Node.js中Async详解:流程控制 安装 npm install async --save 地址 https://github.com/caolan/async Async的内容主要分为三部分 ...

  3. Node.js websocket/ws 详解

    前言 众所周知,HTTP协议是一种无状态.无连接.单向的应用层协议,只能由客户端发起请求,服务端响应请求. 这就显示了一个明显的弊端:服务端无法主动向客户端发起消息,一旦客户端需要知道服务端的频繁状态 ...

  4. Node.js和npm详解(直接上手演示)

    我们先直接操作一下,让你们看效果,刚开始文字说的再多也比不上看一遍效果! 我们用java语言来比较一下 首先java语言是如何在桌面进行编译的呢? 第一步:编写java文件 第二步:在cmd命令框中输 ...

  5. Node.js 从门详解 (二)

    目录 1. 模块化的基本概念 1.1 什么是模块化 1.2 模块化规范 2. Node.js 中模块化 2.1 Node.js 中模块的分类 2.2 加载模块 2.3 Node.js中的模块作用域 2 ...

  6. 【Node.js】关于Node.js接口的详解和案例--restful风格接口。案例:添加商品接口,添加员工接口,删除员工接口

    1.首先我们需要知道,接口是什么? 接口是后端为前端提供的数据--动态资源:Node.js通过每一个路由就可以实现接口 2.RESTful接口:是一种接口的架构风格 1.请求的URL(资源) 在资源前 ...

  7. Node.js 应用开发详解04 3 大主流系统框架:由浅入深分析 Express、Koa 和 Egg.js

    上一讲我们没有应用任何框架实现了一个简单后台服务,以及一个简单版本的 MSVC 框架.本讲将介绍一些目前主流框架的设计思想,同时介绍其核心代码部分的实现,为后续使用框架优化我们上一讲实现的 MSVC ...

  8. 阿里云ECS服务器部署Node.js项目全过程详解

    本文详细介绍如何部署NodeJS项目到阿里云ECS上,以及本人在部署过程中所遇到的问题.坑点和解决办法,可以说是全网最全最详细的教程了.同时讲解了如何申请阿里云免费SSL证书,以及一台ECS服务器配置 ...

  9. js_long.php,protobuf.js 与 Long.js的使用详解

    这次给大家带来protobuf.js 与 Long.js的使用详解,是急用protobuf.js 与 Long.js的注意事项有哪些,下面就是实战案例,一起来看一下. protobuf.js的结构和w ...

最新文章

  1. Android中获取手机的IMEI
  2. 外媒:Facebook新发展方向或模仿微信
  3. Java泛型解析(02):通配符限定
  4. 公司的5GWiFi延迟有多低?来看图体验一下!
  5. Java中的==和equals区别
  6. Struts2依赖的JAR包
  7. VS2010 无法计算HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0@VCTargetPath处的属性表达式...
  8. php科学计算库,科学计算库numpy基础
  9. Verilog HDL语言设计实现过程赋值+译码器
  10. 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...
  11. ERC20合约标准详解分析
  12. UVA11324 强连通+dp记忆化搜索
  13. php 导出excel 数字,PHP导出excel时数字变为科学计数的解决方法
  14. 房地产大数据分析方法
  15. 论文写作---Matlab求解偏导数
  16. 菜鸟心得1 - 在数据清洗过程中使用excel对重复数据进行处理
  17. .NET 通过Word模板,使用AsposeWord进行数据动态导出Word
  18. 搭建Prometheus监控报警系统
  19. Unity 将图片转换成 sprite 格式
  20. 2020-05-19

热门文章

  1. 分享50佳高质量免费按钮图标资源(上篇)[zz]
  2. vs2008和SQL Server使用ADO连接方法
  3. Vue使用vue-cli基于脚手架编写项目_自己编写一个vue基本项目_认识项目结构---vue工作笔记0019
  4. STM32工作笔记0033---编写跑马灯实验---位操作版本
  5. android学习笔记---40_建立能与访问者进行相互通信的本地服务,后台运行的service
  6. Ipimage 转mat
  7. List 列表中的对象在循环中的声明问题
  8. 如何在ps添加箭头_如何利用Word制作出这么漂亮的表格
  9. python输入输出姓名_python学习笔记-执行与输入输出
  10. python的核心理念是什么_Python 面向对象编程的核心概念知识点简介