nodejs入门总结四:http模块

http模块

node.js提供了http模块,其中封装了一个http服务器和一个建议的http客户端。
http.server是一个基于事件的http服务器,内部由c++实现,接口由JavaScript封装。
http.request则是一个http客户端工具,用户向服务器发送请求。

HTTP 模块提供了 5 个类:
(1)http.Agent:创建全局实例,以管理 HTTP 客户端连接的持久性和复用,
(2)http.ClientRequest:当 http.request() 或 http.get() 被调用时,会创建 http.ClientRequest 对象。
(3)http.Server:当使用 http.createServer() 创建新的服务器时,通常会实例化并返回此类。
(4)http.ServerResponse
(5)http.IncomingMessage:http.serverRqueste()

http.serve的事件
http.server是一个基于事件的http服务器,所有请求都被封装成独立的事件,开发者只有对它的事件编写相应函数,实现http服务器的所有功能。它继承于EventEmitter,提供了以下事件:

(1)request:当客户端请求到来时,该事件被触发,提供两个参数req和res,分别是http.ServerRequest和http.IncomingMessage(http.ServerResponse)的实例,表示请求和响应信息;就是我们常用的http.createServer([requestListener])模块;
(2)connection:当TCP连接建立时,该事件被触发,提供一个参数socket,为net.Socket的实例(底层协议底下)
(3)close:当服务器关闭时,该事件被触发,除此之外还有checkContinue、upgrade、clientError事件
(4)listen()启动服务器监听
server.listen(prot,host,backlog,callback) 启动服务器监听
port:监听的端口号,0表示为服务器随机分配一个端口号。
host:监听的地址,默认为本机(localhost)
backlog:指定位于等待队列中的客户端连接的最大数量。超过此数量,则服务器拒绝新的客户端请求。
callback:开启监听后触发的回调函数。当服务器开启监听后会触发listening事件,可以通过监听listening事件来代替callback回调函数。

  1. 创建服务器

const http = require('http'); // 1.导入 http 模块。
const server = http.createServer(); // 2.创建 web 服务器实例。

server.on('request', function(req, res) { // 3.为服务器实例绑定 request 事件,监听客户端请求。
console.log('someone visit our web server');
});

server.listen(8080, function() { // 4.启动服务器监听
console.log('server runing at http://127.0.0.1:8080');
});

server.on("connection",function(socket){ //客户端与服务器创立链接时触发connection事件 }); //监听服务器连接

2. http.IncomingMessage(http.Serverrequest)(请求的信息)
这部分主要包括请求头的设置(常用跨域设置),和请求参数的获取;

http请求分为两部分:请求头和请求体。
请求内容端的直接在请求头解析完成后立即读取,而请求体可能相对较长,需要一定的事件传输,因为提供了三个事件用于控制请求体传输:
(1)data:当请求体数据到来时,该事件被触发,该事件只有一个参数chunk,表示接受到的数据
(2)end:当请求体数据传输完成时,该事件被触发,此后将不会再有数据的到来,必须被调用。
(3)close:当前用户请求结束时,该事件被触发,不同于end,如果用户强制终止了传输,也会触发close

request常用属性:
request.method:请求的方式,值为GET/POST/PUT/DELETE
request.url:获取请求url,常与url模块解析,url.parse(request.url)。
request.headers:HTTP请求头
request.trails:HTTP请求尾(不常见)
request.httpVersion:客户端发送的HTTP版本(通常是1.0/1.1)
request.railers:客户端发送的trailers对象信息。只有IncommingMessage对象的end事件触发后才能读取到该信息。
request.complete:客户端请求是否已经发送完成
request.connection: 当前http连接套间字,为net.Socket的实例
request.socket:connection属性的别名
request.client:client属性的别名

获取get请求信息(请求头)
params = url.parse(req.url, true).query; //urls为nodejs的模块,需引入;第二个参数默认为false,设置成ture后,会返回query的对象

获取post请求信息(请求体)
//注册data事件监听函数,每当接受请求体的数据,
const body='';
request.on('data',function(chunk){
body += chunk;
});

req.on('end',function(){
Const body = querystring.parse(body); //解析成真正的body请求格式,获取的是post的body的参数;
res.end(); //
});

备注:获取url,参数常用模块
var urls = require('url');提供url的解析方法
var querystring = require('querystring');post参数转换
var util = require('util');提供格式化json的方法

3. http.ServerResponse(返回给客户端的信息)
定义用户得到的结果,包括响应头和响应数据设置

常用函数
res.writeHead(statusCode,[heasers]):向请求的客户端发送响应头,该函数在一个请求中最多调用一次,如果不调用,则会自动生成一个响应头
res.write(data,[encoding]):想请求的客户端发送相应内容,data是一个buffer或者字符串,如果data是字符串,则需要制定编码方式,默认为utf-8,在res.end调用之前可以多次调用
res.end([data],[encoding]):结束响应,告知客户端所有发送已经结束,当所有要返回的内容发送完毕时,该函数必需被调用一次,两个可选参数与res.write()相同。如果不调用这个函数,客户端将用于处于等待状态。

response.writeHead(statusCode, [headers]:向请求的客户端发送响应头
  ——Statuscode是http的状态码,如200为成功,404未找到等
  ——headers是一个类似关联数组的对象,表示响应头的每个属性
备注:
headers:响应头对象:常用字段如下:

1、Content-Type:指定返回内容类型

2、location:将客户端重定向到另一个URL地址。

3、content-disposition:指定一个被下载的文件名。

4、content-length:指定响应内容的字节数。

5、set-cookie:在客户端创建的cookie。

6、content-encodinig:指定服务器响应的内容的编码格式。

7、Cache-Control:用于开启缓存机制。

8、Expires:指定缓存过期时间。

9、Etag:指定服务器响应内容没有变化时不重新下载数据。

10、Access-Control-Allow-Origin: 设定允许跨域操作,值为允许想服务器请求数据的域名+端口号

//单独设置响应头,name: 响应字段名 value:响应字段对象的值(通过数组可以指定多个字段值)。
response.setHeader(name,value);
response.getHeader(name) //获取设置的响应头
response.removeHeader(name); //移除已设置的响应头信息

response.write(data,[encoding]):向请求客户端发送响应内容
  ——data是buffer或字符串,
  ——encoding为编码,默认字符串的编码格式为"utf8";

备注:
(1)当使用write方法发送数据时,如果之前没有调用writeHead方法,则Node.js会隐式调用该方法。
(2)response.write方法返回一个布尔类型值:当Node.js直接将数据发送到操作系统的内核缓存区中时,返回true(网络较好的情况时,服务器和客户端收发数据比较流畅),当先把数据缓存到Node.js设置的缓存区中时返回false(适用于服务器和客户端的收发速度不一致的情况,一般指客户端接收数据跟不上服务器的发送速度。这样Node.js先把数据缓存起来,等客户端接收完之前缓存在操作系统内核缓存区的数据时,再将数据发送到操作系统内核缓存区。)

response.end([data],[encoding]):响应结束,告知用户所有发送已经完成,当所有要返回的内容发送完毕,该函数必须被调用一次,如果不调用,客户端永远处于等待的状态

备注:
res.setHeader('Content-Type', 'text/html;charset=utf-8') //可以防止中英文乱码
response.setTimeout(msec,[callback]); //设置响应超时
response.on("timeout",function(){ //超时处理代码 }); //服务器响应超时时间
response.on("close",function(){ //连接中断处理事件});//在执行end之前端口连接,触发该事件;
Response.Flush() 将缓存中的内容立即显示出来,然后再执行后面的语句
reaponse.write(). //向客户端返回数据,可以多次调用,必须调用end()结束服务
response.end() //结束请求,也可以向客户端响应一些内容。参数只限定字符串和Buffer

response.send()。// 参数可以是Buffer对象,String,对象或Array,传入number是没反应的。 在服务器里面直接使用会报错

4. http.ClientRequest
使用http的request方法可以向其他服务器发送请求,类是于axios;
http.request():发送http请求道服务器,创建http.ClientRequest类的实例
http.get():类似于http.request(),但会自动地设置 HTTP 方法为 GET,并自动地调用 req.end()。
(4)socket:服务器端监听客户端请求的socket对象

const req = http.request(options,callback);
options:对象或者字符串,如果为字符串的话,表示要请求的URL地址。如果为对象的话,对象的属性包括以下信息:

host:要请求的域名或主机IP地址。
hostname:同host,优先级高于host(同时存在host和hostname会优先使用hostname)。
port:目标服务器的端口号。
localAddress:用于网络连接的本地接口。
socketPath: 指定目标Unix域端口。
method:请求方式。
path:请求路径及查询字符串,默认为/
header:请求时发送的庆丘头对象。
auth: 认证信息部分。

callback:获取目标网站所返回的响应流时调用的回调函数,原型为:

使用get方式向服务器发送数据
get方式和request方式区别为:request请求方式需要指定请求方式为get方式,并且数据发送结束后需要调用end方式终止响应,get方式结束数据发送时不需要调用end方法,Node.js默认调用。函数原型为:

5. Agent类:连接管理,获取连接数据
http.globalAgent:指向Agent对象的全局实例,用来管理http客户端连接的持久性和复用性;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容