宝哥软件园

对nodejs HTTP服务的深入分析

编辑:宝哥软件园 来源:互联网 时间:2021-09-04

最近在对nodejs的研究中了解到nodejs HTTP服务,所以今天是学习笔记!

nodejs最重要的一个方面是它快速实现HTTP和HTTPS服务器和服务的能力。Http服务是相当低级的。你可能需要不同的模块,比如express,来实现一个完整的Web服务器。http模块不提供处理路由、cookie、缓存等的调用。我们主要使用http模块为应用程序实现后端Web服务。

1.正在处理URL

统一资源定位符(URL)提供了向正确服务器的特定端口发送请求和访问适当数据的所有必要信息。一个网址可以分解成几个不同的组件,每个组件都提供了一条关于网络服务器如何路由和处理来自客户端的HTTP请求的基本信息。节点提供url模块,该模块提供将URL字符串转换为URL对象的功能。

要从网址字符串创建网址对象,请将网址字符串作为第一个参数:

网址。parse (urlstr、[parseQueryString]、[slashesdenothest]),其中parseQueryString参数是布尔值。如果为真,则URL的查询字符串部分也被解析为对象文字,默认值为假。

SlashesDenoteHost参数也是一个布尔值。如果为真,//host/path格式的URL将被解析为{host:' host ',pathname:'/path'}而不是{ path name 3360 '/host/path ' }

您也可以使用url.format(urlObj)方法将一个url对象转换为字符串。

由url.parse()创建的URL对象的属性:

路径完整路径,包括路径和搜索查询,或者是查询字符串的参数部分,或者是包含查询字符串的参数和值的解析对象。如果parseQueryString设置为true,则是解析后的对象搜索URL的查询字符串部分,包括前导问号pathname URL的路径部分(包括起始斜杠,如果有)、端口主机的端口号、主机的主机名、小写auth URL的身份验证信息主机URL的完整主机部分,包括端口信息、小写协议请求协议href,它是初始解析后的完整URL字符串哈希URL的哈希部分,包括哈希号2。解析URL组件。

url模块的一个有用的功能是以与浏览器相同的方式解析URL组件,这允许您在服务器端操纵URL字符串以在URL中进行调整。

将网址解析到新位置:

Url.resolve(from,to) where,from指定原始基本Url字符串,to指定要解析URL的新位置。

例如:

var URL=require(' URL ');var originalur=' http://user :[email protected]:80/资源/路径?query=string # hash ';var new ReSource='/other/path?querynew ';console . log(URL . resolve(Originalurl,NewReSource));

3.处理查询字符串和表单参数

HTTP请求通常在URL中包含查询字符串(通过URL对象获得)或在正文中包含参数数据来处理表单提交(从客户端请求的正文中读取)。querystring和form参数只是基本的键值对,因此需要使用QueryString模块的parse()方法将字符串转换为JavaScript对象:

询问。parse (str,[sep],[eq],[options]) str是一个查询或参数字符串。Sep参数允许您指定使用的分隔符。默认分隔符是eq参数允许您指定分析中使用的赋值运算符。默认值为=。Options参数是一个具有maxKeys属性的对象,它允许您限制生成的对象可以包含的键的数量。默认值为1000。

var qstring=require(' query string ');var params=qstring . parse(' name=Braadcolor=redcolor=blue ');console.log(参数);

4.请求、响应和服务器对象

(1) http。ClientRequest对象

当您构建一个HTTP客户端时,调用http.request()会导致在内部创建一个ClientRequest对象,该对象表示在服务器上进行的请求。通常,ClientRequest对象用于启动、监控和处理来自服务器的响应。

实现ClientRequest对象:

HTTP.request(options,callback),其中options参数是一个对象,其属性定义了如何打开客户端的HTTP请求并将其发送到服务器,包括主机、路径、方法、端口等属性。回调是一个回调函数,在向服务器发送请求后处理服务器返回的响应时调用。这个回调函数的唯一参数是一个IncomingMessage对象,它是服务器的响应。

ClientRequest对象的基本实现;

var http=require(' http ');var options={ hostname : ' www . my server.com ',path:'/',port:'8080 ',method : ' POST ' };var req=http.request(选项,函数(响应){ var str=response.on('data ',function(chunk){ str=chunk;});response.on('end ',function(){ console . log(str);});});req . end();ClientRequest对象的方法:

Write(chunk,[encoding])将正文数据块(Buffer或String对象)写入请求结束([data],[encoding])将可选数据写入请求正文,然后刷新可写流并终止请求中止()终止当前请求setTimeout(timeout,[callback])为请求设置套接字超时时间。setNoDelay([noDelay])在发送数据前禁用缓冲数据的Nagle算法。Nodlay为布尔值,true表示立即写入,false表示缓冲写入setsockeetkeepalive([启用],[初始延迟])启用和禁用客户端请求的保持活动功能。Enable默认为false,即禁用;InitialDelay指定最后一个数据包和第一个保活请求(2)http之间的延迟。服务器响应对象

当HTTP服务器接收到一个请求事件时,它会在内部创建一个服务器响应对象,作为第二个参数传递给请求事件处理程序。您可以使用服务器响应对象来指定发送到客户端的响应。

服务器响应对象的方法:

WriteContinue()向客户端发送HTTP/1.1 100 Continue消息,请求发送的正文内容writehead(状态代码、[原因短语]、[标头])将响应标头写入请求,例如response.writeHead(200、' successs '、{ ' Content-Length ' : body . Length、' Content-Type ' : ' text/plain ' });SetTimeout(timeout,[callback])设置客户端连接的套接字超时setHeader(name,Value)设置特定的头值getHeader(name)获取响应中的HTTP头集removeHeader(name)删除响应中的HTTP头集write(chunk,[encoding])写入响应的可写流中的chunk、Buffer或String对象,仅将数据写入响应的正文部分addduaters(heads)将HTTP尾随头写入响应的结尾([data],[encoding])将可选数据输出写入响应的正文中,传入消息对象

HTTP服务器和客户端都创建IncomingMessage对象,这些对象实现可读流,因此您可以将客户端请求或服务器响应作为流法庭来读取,这意味着可以监视它们的可读和数据事件,并使用它们从流中读取数据。

IncomingMessage对象中可用的事件、属性和方法

当底层套接字关闭时,Close发出HTTPVersion。指定用于构建客户端请求/响应的http版本。headers包含一个对象,该对象带有随请求/响应一起发送的头。方法指定它用于请求/由响应url statusCode发送到服务器的URL字符串指定来自服务器的3位状态代码套接字,一个指向网络的句柄。套接字对象,用于与客户端/服务器通信。setTimeout(超时,[回调])设置连接(4)HTTP Server对象的套接字超时时间。

HTTP server对象提供了一个实现HTTP Server的基本框架,它提供了监听端口的底层套接字和接收请求然后向客户端连接发送响应的处理程序。当服务器正在侦听时,节点应用程序不会结束。

要启动HTTP服务器,首先需要createServer()方法来创建服务器对象:

http。创建服务器([请求侦听器])此方法返回计算机网络服务器对象,requestListener参数是在请求事件被触发时执行的回调函数,此回调函数接收两个参数,一个是代表客户端请求的输入消息对象,第二个参数是用来指定和发送响应的服务器响应对象。

创建了计算机网络服务器对象,就可以在计算机网络服务器对象上的听着()方法开始监听它:

监听(端口、[主机名]、[积压]、[回调])一个基本的例子:

var http=require(' http ');http.createServer(函数(请求,资源){//处理resquest和响应}).听(8080);实现一个基本的静态文件服务

//实现一个静态文件服务器var fs=require(' fs ');var http=require(' http ');var URL=必选(' URL ');//创建一个服务器函数(req,res){ if(req.url!='/fav图标。ico’){ var URL obj=URL。解析(请求。URL,真,假);控制台。日志(URl obj。路径名);fs.readFile(' . 'urlObj.pathname ' .html ',函数(err,data){ if(err){ RES . write head(404);决议结束(JSON。stringify(err));返回;}控制台。日志(数据。tostring());//将文件的内容写入表示留数响应对象res.end(数据);});}}).听(8080);//实现一个超文本传送协议客户端,向服务器发送一个得到请求来检索文件内容var options={ hostname : ' 127。0 .0 .1 ',端口:'8080 ',路径: '/AAA ' };//开('数据)读取来自服务器的响应中的内容,on('end ')把文件内容记录到到一个文件函数handleResponse(response){ var serverData=' ';response.on('data ',function(chunk){ serverData=chunk;});response.on('end ',function(){ console。日志(服务器数据);});}http.request(选项),功能(响应){ handleResponse(响应);}).end();

实现动态的得到服务器

var http=require(' http ');var messages=[ 'message1 ',' message2 ',' message 3 '];函数(req,RES){ RES . setheader(' Content-Type ',' text/html ');读写头(200);RES . write(' HTMl头标题Http Server/title/head ');RES . write(“正文”);用于(消息中的var idx){ RES . write(' nh1 '消息[idx]'/h1 ');} RES . end(' n/body/html ');}).听(8080);var options={ hostname : ' localhost ',port : ' 8080 ' };函数handleResponse(response){ var serverData=' ';response.on('data ',function(chunk){ serverData=chunk;});response.on('end ',function(){ console。日志('响应状态3360 ',响应。状态代码);控制台。log('响应头s : ',response . header console . log(服务器数据);});}http.request(选项),功能(响应){ handleResponse(响应);}).end();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+