手机版

NodeJS学习笔记之超文本传送协议(超文本传输协议的缩写)模块

时间:2021-10-15 来源:互联网 编辑:宝哥软件园 浏览:

一,开篇分析

首先" Http "这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的,

开发作为一个宿主运行环境,以Java脚本语言为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下" Http模块" 。但是作为前提来说,

希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是超文本传送协议(超文本传输协议的缩写)部分的美国石油学会(美国石油协会)概览:

复制代码代码如下:HTTP .状态代码。创建服务器([请求侦听器])http。创建客户端([端口],[主机]) Class: http .计算机网络服务器事件:"请求"事件:"连接"事件:"关闭"事件:"检查继续"事件:“连接”事件:“升级”事件:“客户端错误”服务器。听着(端口、[主机名]、[backlog]、[callback])服务器路径、[回调])服务器句柄、[回调])服务器。关闭([回调])服务器。maxheaders计数服务器。settimeout(msecs,回调)服务器。超时类: http .服务器响应事件:“关闭”响应。write continue()响应。写头(状态代码、[推理短语]、[头])响应。settimeout(msecs,回调)响应。状态代码响应。setheader(名称)响应。标题已发送。发送日期响应。getheader(name)响应。removeheader(名称)响应。write(chunk,[编码])响应。addduates(标头)响应。end([数据],[编码])。请求(选项,回调)http.get(选项,回调代理新建代理([选项])代理。最大套接字代理。maxFreeSockets代理。套接字代理。免费套接字代理。要求代理。销毁()代理。getName(选项)http.globalAgent Class: http .ClientRequest事件'响应事件: '套接字'事件:“连接”事件:“升级”事件:“继续”请求。write(chunk,[encoding]) request.end([data],[encoding])请求。中止()请求。settimeout(超时,[回调])请求。setnodelay([noDelay])请求。setsocketekeepalive([enable],[initialDelay]).输入消息事件:“关闭”消息。httpversion消息。邮件标题。原始邮件头。duates消息。原始消息。settimeout(ms ECS,回调)消息。方法消息。URL消息。statuscode消息。窝

让我们先从一个简单例子开始,创建一个叫server.js的文件,并写入以下代码:

复制代码代码如下: var http=require(' http ');var服务器=http。createserver(function(req,res){res.writeHeader(200,{ 'Content-Type' : '纯文本/纯文本;charset=utf-8' //添加charset=utf-8 });res.end('你好,大熊!') ;}) ;服务器。听(8888);console.log('在端口8888上运行的超文本传送协议(Hyper Text Transport Protocol的缩写)服务器.') ;

(node server.js)以下是运行结果:

二,细节分析实例

具体看一下这个小例子:

(1行):通过要求引入开发自带的" http "模块,并且把它赋值给超文本传送协议(超文本传输协议的缩写)变量。

(2行):调用超文本传送协议(超文本传输协议的缩写)模块提供的函数:"创建服务器".这个函数会返回一个新的网服务器对象。

参数"请求侦听器"是一个函数,它将会自动加入到请求事件的监听队列。

当一个请求到来时事件循环会将这个听众回调函数放入执行队列,节点中所有的代码都是一个一个从执行队列中拿出来执行的。

这些执行都是在工作线程上(事件循环本身可以认为在一个独立的线程中,我们一般不提这个线程,而将结节称呼为一个单线程的执行环境),

所有的回调都是在一个工作线程上运行。

我们在再来看一下"请求侦听器"这个回调函数,它提供了两个参数(请求、响应),

每次收到一个请求时触发。注意每个连接又可能有多个请求(在点火电极的连接中)。

请求是http .输入消息的一个实例"回应"是http .服务器响应的一个实例。

http请求对象是可读的流,而http响应对象是可写的流。

http创建了一个“IncomingMessage”对象。服务器或http.ClientRequest。

并作为第一个参数分别传递给“请求”和“响应”事件。

它还可以用来访问响应状态、头文件和数据。

它实现了“流”接口和以下附加事件、方法和属性。(详情见api)。

(第3行):“writeHeader”,使用‘response . WriteHeader()’函数发送Http状态200和Http头的内容类型。

回复请求的响应头。“状态代码”是一个三位数的HTTP状态代码,如404。最后一个参数“headers”是响应头的内容。

举个栗子:

复制的代码如下:var body=' hello worldresponse.writeHead(200,{ ' Content-Length ' : body . Length,' Content-Type ' : ' text/plain ' });

注意:内容-长度是以字节计算的,而不是字符。

上例的原因是字符串“Hello World!”它只包含一个字节的字符。

如果正文包含多字节编码字符,在多字节字符编码的情况下,应该使用Buffer.byteLength()来确定字符串的字节数。

此外,节点不检查内容长度属性是否与传输的正文长度匹配。

代码是一个三位数的HTTP状态代码,例如,“404”。我们这里要说的是‘Http’。包含所有标准“http”响应状态代码的集合和简短描述。

以下是源代码参考:

复制代码如下:VAR STATUS _ CODES=导出。STATUS _ CODES={100 : '继续',101 : '切换协议',102 : '处理',//RFC 2518。被RFC 4918废弃200 :“确定”,201 :“已创建”,202 :“已接受”,203 :“非权威信息”,204 :“无内容”,205 :“重置内容”,206 :“部分内容”,207 :“多状态”,//RFC 4918 300 :“多种选择” 405 :“不允许的方法”,406 :“不可接受”,407 :“需要代理身份验证”,408 :“请求超时”,409 :“冲突”,410 :“消失”,411 :“需要长度”,412 :“先决条件失败”,413 :“请求实体太大”,414 :“请求-URI太大” //RFC 4918 424 : '失败依赖',//RFC 4918 425 : '无序收集',//RFC 4918 426 : '需要升级',//RFC 2817 500 : '内部服务器错误',501 : '未实现',502 : '坏网关',503 : '服务不可用',504 : '

节选自Nodejs源代码“http.js”第143行的开头。

事实上,从客户端的响应结果中不难看出:

(第6行):“回应。end”-当发送完所有响应头和消息时,该方法将信号发送给服务器。服务器会认为消息是完整的。

必须在每个响应完成后调用此方法。如果指定了参数“data”,相当于先调用“response.write(data,encoding)”,再调用“response.end()”。

(8行):“服务器。listen(8888)”-服务器接受具有指定句柄的连接,并将其绑定到特定端口。

以上是比较详细的分析过程,希望有助于加深理解。虽然代码不多,但重点了解一些详细的机制,以便日后高效开发NodeJS应用。

第三,例子。

除了使用“request”对象访问请求头数据之外,还可以使用“request”对象作为只读数据流来访问请求体数据。

这是一个“开机自检”请求的示例:

复制代码如下:http.createserver(函数(请求,响应){ var body=[];console . log(request . method);console . log(request . headers);request.on('data ',function(chunk){ body . push(chunk);}) ;request.on('end ',function(){ body=buffer . concat(body);console . log(body . tostring());});}).听(8888);

是下一个完整的“Http”请求数据内容。

复制代码如下: post/http/1.1 user-agent : curl/7 . 26 . 0 host 3360 localhost accept 3360 */* content-length : 11 content-type 3360 application/x-www-form-URL encoded hello world。

第四,总结。

(1)理解‘Http’的概念。(2)熟练使用与‘Http’相关的api。(3)注意细节的控制,比如“POST、GET”之间的处理细节。(4)对“请求监听器”的理解。(5)强调一个概念:http请求对象是可读流,而http响应对象是可写流。

版权声明:NodeJS学习笔记之超文本传送协议(超文本传输协议的缩写)模块是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。