专栏首页Node Python Go全栈开发Node核心模块篇:HTTP

Node核心模块篇:HTTP

借助于各种框架强大的力量,Node.js的开发已经变得越来越便捷而高效。然而抛开这些框架,我们是否又对Node.js的核心模块及底层有一个清晰和深刻的认识呢?本系列文章将会与各位一起重新了解学习Node.js的各个核心模块。

HTTP协议是世界上广泛使用的应用层通信协议,而通过Node的核心模块HTTP,我们可以方便快速的构建自己的HTTP服务器和客户端,并在两者之间进行通信传递数据。

HTTP模块API一览


Class: http.Agent

一般的通信过程都会重复'请求连接'到'通信'到'断开连接'这个过程,然而对于一个持续长时间进行的通信过程而言,不停的连接、断开、重新连接显然是浪费通信资源且没有必要的,为了满足这种场景的需求,“长连接”便出现了。http.Agent 的作用正是为了在Node中实现长连接并池化socket。

Class: http.ClientRequest

该对象在内部被创建,并从 http.request() 返回。 用于处理客户端请求,是一个事件发射器。可通过其内部方法进行中止请求、完成请求、设置超时、发送数据块等等操作。

Class: http.Server

服务器对象,监听了客户端请求、建立连接、服务器关闭等等在内的多个事件,可通过其方法设置服务器超时、监听指定端口和主机、关闭服务器等。

Class: http.ServerResponse

该对象由HTTP服务器内部创建,代表服务器响应,可进行响应状态码处理、响应超时设置、消息头处理等操作。

Class: http.IncomingMessage

该对象由 http.server 或 http.ClientRequest 创建,并作为第一个参数分别递给 request 和 response 事件。 它可以用来访问响应状态、消息头、以及数据。

http.METHODS

解析器支持的HTTP方法列表。

http.STATUS_CODES

标准的HTTP状态码和描述集合。

http.createServer([requestListener])

用于创建一个HTTP服务器,返回的是 http.Server 实例。

http.get(options[,callback])

get请求便捷方法,也就是 http.request() 方法的特例。

http.globalAgent

agent代理的全局实例对象,所有HTTP客户端请求的默认agent。

http.request(options[,callback])

发起HTTP请求的方法,返回的是 http.ClientRequest 实例对象。

HTTP代码实战


接下来我们将运用HTTP模块的API来创建一个HTTP服务器及客户端,并让两者之间进行简单的通信。

创建HTTP服务器

const http = require('http');

const hostname = '127.0.0.1';

const port = 3456;

const server = http.createServer((req, res)=>{

console.log(`request url: ${req.url}`);

if (req.url === '/http') {

res.statusCode = 200;

res.setHeader('Content-Type', 'text/plain');

res.end('this is server response.');

} else {

res.statusCode = 404;

res.end('not found!');

}

req.on('data', (chunk) => {

console.log(`request data from client:

${chunk}`);

});

});

server.listen(port, hostname, ()=>{

console.log(`Server running at

http://${hostname}:${port}/`);

});

以上代码,通过 http.createServer 方法创建了一个服务器,其监听的主机也就是代码运行的本机,端口号则是3456,该服务器的功能为判断客户端请求的url地址,如果是'/http',则返回200状态码,和一条消息给客户端,否则,返回404状态码和'not found'消息。

创建HTTP客户端

const http = require('http');

let options = {

hostname: '127.0.0.1',

port: 3456,

path: '/http',

method: 'post',

}

let req = http.request(options, (res) => {

console.log(`STATUS:

${res.statusCode}`);

console.log(`HEADERS:

${JSON.stringify(res.headers)}`);

res.setEncoding('utf8');

res.on('data', (chunk) => {

console.log(`response from server : ${chunk}`);

});

res.on('end', () => {

console.log('No more data in response.');

});

});

req.on('error', (e) => {

console.log(`problem with request:

${e.message}`);

});

req.write('this is client request.');

req.end();

以上代码作为一个HTTP客户端,通过 http.request 方法向之前创建好的服务器发送POST请求,请求的地址为'/http',发送给服务器‘this is client request.’字符串,并接受服务器返回的状态码、消息头和数据。

注意:以上服务器和客户端代码分别构建在两个js文件中,可以通过命令行直接运行。

以上,我们简要的回顾了HTTP模块的顶层API,并构建了一个简单的服务器和客户端通信的示例。

本文分享自微信公众号 - Node Python Go全栈开发(gh_9ccbe5e0dfb3),作者:rifewang

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 通过 slack 快速构建实时日志

    日志对任何一个应用程序的重要性不言而喻,如果能够实时查看到日志信息,我们便可以更早的发现系统中的漏洞和不足。

    凌虚
  • 用回调函数调用异步流回调函数内的数据

    本文的标题看起来也许比较绕,看不懂也没关系,后面会慢慢说明。写这篇文章是为了记录一下前几天我碰到的一个问题。

    凌虚
  • 构建应用服务的十二条准则

    构建一个稳健易扩展的应用服务一直是我们不断追求的事情。早在九年前,《The Twelve-Factor APP》一文便从 12 个方面进行了软件开发准则的相关总...

    凌虚
  • Nodejs创建http客户端及代理服务器

    nodejs除了可以通过http模块创建服务器,还能创建客户端,类似于浏览器那样很轻松的去向别的服务器发送请求并获取响应数据。

    前端_AWhile
  • 真正“搞”懂http协议01—背景故事

    zaking
  • 第十一章 http标准库和其他标准库

    四. 第四个讲的是pprof, 我之前在测试的时候已经详细研究过pprof用来监控web服务的性能, 这里就不在描述了,

    用户7798898
  • Go语言经典库使用分析(四)| Gorilla Handlers 源代码实现分析

    上一篇 Go语言经典库使用分析(三)| Gorilla Handlers 详细介绍 中介绍了Handlers常用中间件的使用,这一篇介绍下这些中间件实现的原理...

    飞雪无情
  • scrapy设置代理ip

    版权信息所有者:chenjiabing 如若转载请标明出处:chenjiabing666.github.io6

    爱撒谎的男孩
  • Go语言经典库使用分析(七)| 高性能可扩展 HTTP 路由 httprouter

    Go语言(golang)的一个很大的优势,就是很容易的开发出网络后台服务,而且性能快,效率高。在开发后端HTTP网络应用服务的时候,我们需要处理很多HTTP的请...

    飞雪无情
  • go cookie 使用

    solate

扫码关注云+社区

领取腾讯云代金券