深入解析nodejs HTTP服务


Posted in NodeJs onJuly 25, 2017

我最近在研究nodejs的路上,正好这两天了解了nodejs HTTP服务,那么今天也算个学习笔记吧!

nodejs最重要的方面之一是具有非常迅速的实现HTTP和HTTPS服务器和服务的能力。http服务是相当低层次的,你可能要用到不同的模块,如express来实现完整的Web服务器,http模块不提供处理路由、cookie、缓存等的调用。我们主要用http模块的地方是实现供应用程序使用的后端Web服务。

 1.处理URL

统一资源定位符(URL)为把一个请求发到正确的服务器的特定端口上,并访问合适的数据提供了所有需要的信息。一个URL可以被分解成几个不同的组成部分,每个部分都为Web服务器如何路由和处理来自客户端的HTTP请求提供一块基本的信息。node提供了url模块,提供了把一个URL字符串转换成一个URL对象的功能。

要从一个URL字符串创建URL对象,把URL字符串作为第一个参数下面的方法:

url.parse(urlStr,[parseQueryString],[slashesDenoteHost)

其中,parseQueryString参数是一个布尔值,如果为true,那么也把URL的查询字符串部分解析为对象字面量,默认值为false。

slashesDenoteHost参数也是一个布尔值,如果为true,那么就会把格式为//host/path的URL解析为{host:'host',pathname:'/path'},而不是{pathname:'//host/path'}

还可以用url.format(urlObj)方法将一个URL对象转换成字符串的形式。 

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

  1. path     完整路径,包括路径和搜索
  2. query  要么是查询字符串中的参数部分,要么是含有查询字符串参数和值的解析后的对象。如果parseQueryString设置为true,那么就是解析后的对象
  3. search   URL的查询字符串部分,包括前导的问号
  4. pathname   URL的路径部分(包括最初的斜线,如果存在的话)
  5. port   主机的端口号
  6. hostname  主机的主机名,小写
  7. auth  URL的身份认证信息
  8. host  URL的完整主机部分,包括端口信息,小写
  9. protocol    请求协议
  10. href   这是最初解析的完整的URL字符串
  11. hash  URL的散列部分,包括井号

2.解析URL组件

url模块有用的一种功能就是用与浏览器相同的方式来解析URL的组件,这可以让你在服务器端操作URL字符串,以在URL中作出调整。

把一个URL解析到新的位置:

url.resolve(from,to)

其中,from指定了原始基础URL字符串,to指定了想要URL被解析到的新位置。

举个例子:

var url=require('url');
var originalUrl='http://user:pass@host:80/resource/path?query=string#hash';
var newResource='/another/path?querynew';
console.log(url.resolve(originalUrl,newResource));

深入解析nodejs HTTP服务

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

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

querystring.parse(str,[sep],[eq],[options])

str是查询或参数字符串,sep参数允许你指定使用的分隔符,默认的分隔符是&,eq参数允许你指定分析时使用的赋值运算符,默认值为=,options参数是一个具有属性maxKeys的对象,它能够让你限制生成的对象可以包含的键的数量,默认是1000。

var qstring=require('querystring');
var params=qstring.parse('name=Braad&color=red&color=blue');
console.log(params);

深入解析nodejs HTTP服务

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

(1) http.ClientRequest对象

当你构建一个HTTP客户端时,调用http.request()使得一个ClientRequest对象在内部被创建,这个对象是为了当该请求在服务器上进展的时候来表示它。通常使用ClientRequest对象来启动、监控和处理来自服务器的响应。

实现ClientRequest对象:

http.request(options,callback)

其中,options参数是一个对象,其属性定义了如何把客户端的HTTP请求打开并发送到服务器,包括host,path,method,port等属性。callback是一个回调函数,在把请求发送到服务器后,处理从服务器返回的响应时调用此回调函数,此回调函数唯一的参数是一个IncomingMessage对象,该对象是来自服务器的响应。

一个ClientRequest对象的基本实现:

var http=require('http');
var options={
  hostname:'www.myserver.com',
  path:'/',
  port:'8080',
  method:'POST'
};
var req=http.request(options,function(response){
  var str='';
  response.on('data',function(chunk){
    str+=chunk;
  });
  response.on('end',function(){
    console.log(str);
  });
});
req.end();

ClientRequest对象的方法:

  1. write(chunk,[encoding])   把一个正文数据块(Buffer或String对象)写入请求
  2. end([data],[encoding])   把可选的数据写入请求正文,然后刷新Writeable流并终止该请求
  3. abort()   终止当前的请求
  4. setTimeout(timeout,[callback])   为请求设置套接字超时时间
  5. setNoDelay([noDelay])    禁用在发送数据之前缓冲数据的Nagle算法,noDelay是一个布尔值,true表示立即写,false表示缓冲写入
  6. setSocketKeepAlive([enable],[initialDelay])     启用和禁用对客户机请求的保持活动功能,enable默认为false,即禁用;initialDelay指定最后一个数据包和第一个保持活动请求之间的延迟

(2)http.ServerResponse对象

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

ServerResponse对象的方法:

  1. writeContinue()  发送一个HTTP/1.1 100 Continue消息给客户端,请求被发送的正文内容
  2. writeHead(statusCode,[reasonPhrase],[headers])    把一个响应标头写入请求,例如response.writeHead(200,'successs',{'Content-Length':body.length,'Content-Type':'text/plain'});
  3. setTimeout(timeout,[callback])   设置客户端连接的套接字超时时间
  4. setHeader(name,value)   设置一个特定的标头值
  5. getHeader(name)   获取已在响应中设置的一个HTTP标头
  6. removeHeader(name)    移除已在响应中设置的一个HTTP标头
  7. write(chunk,[encoding])   写入chunk,Buffer或String对象到响应Writeable流,仅把数据写入响应的正文部分
  8. addTrailers(headers)     将HTTP尾随标头写入响应的结束处
  9. end([data],[encoding])   把可选的数据输出写入响应的正文,然后刷新Writeable流并响应该请求

(3)http.IncomingMessage对象

HTTP服务器和客户端都创建IncomingMessage对象,该对象实现了Readable流,让你能够把客户端请求或服务器响应作为流院读入,这意味着它们的readable和data事件可以被监听并用来从流中读出数据。

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

  1. close   当底层套接字被关闭时发出
  2. httpVersion   指定用于构建客户端请求/响应的HTTP版本
  3. headers   包含了随请求/响应发送的标头的一个对象
  4. method   指定用于请求/响应的方法
  5. url   发送到服务器的URL字符串
  6. statusCode   指定来自服务器的3位数状态码
  7. socket   一个指向net.Socket对象的句柄,用来与客户端/服务器的通信
  8. setTimeout(timeout,[callback])   设置连接的套接字超时时间

(4)HTTP Server对象

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

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

http.createServer([requestListener])

此方法返回Server对象,requestListener参数是在请求事件被触发时执行的回调函数,此回调函数接收两个参数,一个是代表客户端请求的IncomingMessage对象,第二个参数是用来指定和发送响应的ServerResponse对象。

创建了server对象,就可以在server对象上的listen()方法开始监听它:

listen(port,[hostname],[backlog],[callback])

一个基本的例子:

var http=require('http');
http.createServer(function(req,res){
  //handle resquest and response
}).listen(8080);

实现一个基本的静态文件服务

//实现一个静态文件服务器
var fs=require('fs');
var http=require('http');
var url=require('url');
//创建一个服务器
http.createServer(function(req,res){
  if(req.url!="/favicon.ico"){
    var urlObj=url.parse(req.url,true,false);
    console.log(urlObj.pathname);
    fs.readFile('.'+urlObj.pathname+'.html',function(err,data){
      if(err){
        res.writeHead(404);
        res.end(JSON.stringify(err));
        return;
      }
      console.log(data.toString());
      //将文件的内容写入res响应对象
      res.end(data);
    });
  }
}).listen(8080);
//实现一个HTTP客户端,向服务器发送一个GET请求来检索文件内容
var options={
  hostname:'127.0.0.1',
  port:'8080',
  path:'/aaa'
};
//on('data')读取来自服务器的响应中的内容,on('end')把文件内容记录到到一个文件
function handleResponse(response){
  var serverData='';
  response.on('data',function(chunk){
    serverData+=chunk;
  });
  response.on('end',function(){
    console.log(serverData);
  });
}
http.request(options,function(response){
  handleResponse(response);
}).end();

深入解析nodejs HTTP服务

实现动态的GET服务器

var http=require('http');
var messages=[
  'message1',
  'message2',
  'message3'
];
http.createServer(function(req,res){
  res.setHeader('Content-Type','text/html');
  res.writeHead(200);
  res.write('<html><head><title>HTTP Server</title></head>');
  res.write('<body>');
  for(var idx in messages){
    res.write('\n<h1>'+messages[idx]+'</h1>');
  }
  res.end('\n</body></html>');
}).listen(8080);
var options={
  hostname:'localhost',
  port:'8080'
};
function handleResponse(response){
  var serverData='';
  response.on('data',function(chunk){
    serverData+=chunk;
  });
  response.on('end',function(){
    console.log('response status: ',response.statusCode);
    console.log('response headers: ',response.headers);
    console.log(serverData);
  });
}
http.request(options,function(response){
  handleResponse(response);
}).end();

深入解析nodejs HTTP服务

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

NodeJs 相关文章推荐
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
nodejs个人博客开发第五步 分配数据
Apr 12 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
Nodejs回调加超时限制两种实现方法
Jun 09 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
NodeJS如何实现同步的方法示例
Aug 24 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 #NodeJs
nodejs 搭建简易服务器的图文教程(推荐)
Jul 18 #NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 #NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 #NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 #NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 #NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 #NodeJs
You might like
第七节 类的静态成员 [7]
2006/10/09 PHP
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
10个新的最有前途的JavaScript框架
2009/03/12 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
论JavaScript模块化编程
2016/03/07 Javascript
vue.js通过自定义指令实现数据拉取更新的实现方法
2016/10/18 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
js实现可输入可选择的select下拉框
2016/12/21 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
2017/02/28 Javascript
利用JavaScript对中文(汉字)进行排序实例详解
2017/06/18 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
vue组件的写法汇总
2018/04/12 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
vue-resource:jsonp请求百度搜索的接口示例
2019/11/09 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
举例讲解Python中is和id的用法
2015/04/03 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
用pandas中的DataFrame时选取行或列的方法
2018/07/11 Python
想学python 这5本书籍你必看!
2018/12/11 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
2019/10/24 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
类的核心特性有哪些
2014/01/01 面试题
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
信用卡工资证明范本
2015/06/19 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
2016年暑期见闻作文
2015/11/25 职场文书
公司与个人合作协议书
2016/03/19 职场文书
一篇文章学会Vue中间件管道
2021/06/20 Vue.js