博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Node核心模块HTTP】
阅读量:5983 次
发布时间:2019-06-20

本文共 5129 字,大约阅读时间需要 17 分钟。

环境:Node v8.2.1; Npm v5.3.0; OS Windows10

客户端、服务端对我们都不陌生,Node.js 中的 HTTP 接口被设计成支持协议的许多特性。 比如,大块编码的消息。 这些接口不缓冲完整的请求或响应,用户能够以流的形式处理数据。

为了支持各种可能的 HTTP 应用,Node.js 的 HTTP API 是非常底层的。 它只涉及流处理与消息解析。 它把一个消息解析成消息头和消息主体,但不解析具体的消息头或消息主体。

1、API结构图

由于该模块中的内容比较多,图片我就分开传了,避免一张图密密麻麻的。

1.1 模块类结构图

图片描述

1.2 Agent类结构图

图片描述

1.3 ClientRequest类结构图

图片描述

1.4 Server 类结构

图片描述

1.5 ServerResponse类结构图

图片描述

1.6 IncomingMessage类结构图

图片描述

1.7 静态方法和属性图

图片描述

2、类关系

在看API之前,我还是简单的缕一缕上面几个类的关系吧,从一个简单的例子开始

2.1 简单且核心的例子

const http = require("http");//serverconst server = http.createServer((clientReq,serverRes)=>{    serverRes.end();}).listen(3000)//clientconst client=http.get("http://localhost:3000",(clientRes)=>{    })

上面那么简单的几行代码已经成功创建了一个server和一个client,看似简单,实际上却不这样,上面代码以一共创建了4个实例,可以对照着顶部的那张图看。

  • server:http.Server 类的实例,用来提供服务,处理客户端的请求。
  • client:http.ClientRequest 类的实例,用于向服务端发起请求
  • clientReq/clientRes:http.IncomingMessage 类的实例,【clientReq】用于服务端获取客户端请求的信息,【clientRes】用于客户端获取服务端返回的相关消息
  • serverRes:http.ServerResponse 类实例,用于服务端响应客户端请求

2.2 类关系图

图片描述

图片有点乱,在画图本里面拖出来的,讲究看吧,下面贴出继承关系的源码,只贴框架,里面具体的内容就不贴了,贴出来感觉蛮乱的。

http.IncomingMessage 类继承 stream.Readable:

export class IncomingMessage extends stream.Readable {}

http.ServerResponse 类继承stream.Writable:

export class OutgoingMessage extends stream.Writable {}export class ServerResponse extends OutgoingMessage {}

3、一些例子

下面是部分API的例子,对部分API的一个简单代码实现

3.1 server属性

const http = require("http");const server=http.createServer((ClientRequest,ServerResponse)=>{  ServerResponse.end();})server.listen(3000);console.log("listening: "+server.listening);console.log("maxHeadersCount: "+server.maxHeadersCount);console.log("timeout: "+server.timeout);console.log("keepAliveTimeout: "+server.keepAliveTimeout);// listening: true// maxHeadersCount: null (没有限制)// timeout: 120000// keepAliveTimeout: 5000

3.2 server事件

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {    ServerResponse.end();}).listen(3000);server.on("request", (request, response) => {    console.log("服务端收到请求");})server.on("connection",socket=>{    //超过默认的5000msTCP流会被关闭,再次请求时会被重新建立    console.log("一个新的 TCP 流被建立");})

3.3 serverResponse属性

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {    ServerResponse.writeHead(200, { 'Content-Type': 'text/plain'});    ServerResponse.write("hello world");    console.log("connection: "+ServerResponse.connection);    console.log("finished: "+ServerResponse.finished);    console.log("headersSent: "+ServerResponse.headersSent);    console.log("sendDate: "+ServerResponse.sendDate);    console.log("socket: "+ServerResponse.socket);    console.log("statusCode: "+ServerResponse.statusCode);    console.log("statusMessage: "+ServerResponse.statusMessage);    ServerResponse.end();    console.log("finished: "+ServerResponse.finished);}).listen(3000);/*    connection: [object Object]    finished: false    headersSent: true    sendDate: true    socket: [object Object]    statusCode: 200    statusMessage: OK    finished: true*/

3.4 addTrailers()

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {    ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });    ServerResponse.write("hello world");    ServerResponse.addTrailers({'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667'})    ServerResponse.end();}).listen(3000);

3.5 getHeader()

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {    ServerResponse.setHeader("foo","bar");    ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });    ServerResponse.write("hello world");    console.log(ServerResponse.getHeader("foo"));    ServerResponse.end();}).listen(3000);

3.6 getHeaderNames()

const http = require("http");const server = http.createServer((ClientRequest, ServerResponse) => {    ServerResponse.setHeader("foo","bar");    ServerResponse.writeHead(200, { 'Content-Type': 'text/plain' });    ServerResponse.write("hello world");    console.log(ServerResponse.getHeaderNames());    //[ 'foo', 'content-type' ]    ServerResponse.end();}).listen(3000);

3.7 get()

const http = require("http");const ClientRequest = http.get("http://localhost:3000", res => {    res.setEncoding("utf8")    let rawData = '';    res.on("data", chunk => {        rawData += chunk;    })    res.on("end", () => {        console.log(rawData);    })})ClientRequest.on("response", (imsg) => {    console.log("收到响应");})

3.8 http.request

摘一个官方例子^_^

const postData = querystring.stringify({  'msg' : 'Hello World!'});const options = {  hostname: 'www.google.com',  port: 80,  path: '/upload',  method: 'POST',  headers: {    'Content-Type': 'application/x-www-form-urlencoded',    'Content-Length': Buffer.byteLength(postData)  }};const req = http.request(options, (res) => {  console.log(`状态码: ${res.statusCode}`);  console.log(`响应头: ${JSON.stringify(res.headers)}`);  res.setEncoding('utf8');  res.on('data', (chunk) => {    console.log(`响应主体: ${chunk}`);  });  res.on('end', () => {    console.log('响应中已无数据。');  });});req.on('error', (e) => {  console.error(`请求遇到问题: ${e.message}`);});// 写入数据到请求主体req.write(postData);req.end();

转载地址:http://sqrox.baihongyu.com/

你可能感兴趣的文章
Ubuntu安装Chrome的方法
查看>>
用批处理来操纵你的光驱
查看>>
SQL 问题记录
查看>>
vim修改时自动备份配置文件小脚本
查看>>
我的友情链接
查看>>
官宣:深度剖析免费OA系统是如何盈利
查看>>
vue2.0学习笔记(一)搭建学习环境
查看>>
数据库热备产品都有哪些?各有什么优缺点?
查看>>
生成树协议(STP)
查看>>
hadoop大数据基础框架技术详解
查看>>
Apache日志分割&日志分析
查看>>
MySQL完全备份与恢复
查看>>
JVM内存结构 VS Java内存模型 VS Java对象模型
查看>>
__main__:1: Warning: Unknown table 'employ' 0L
查看>>
Linux练习题-文件查找
查看>>
python bottle 简介
查看>>
设计微服务的最佳实践
查看>>
后缀.COLORIT勒索病毒分析和解决方案,.COLORIT勒索病毒如何处理
查看>>
Sketch技巧—数字运算改变图层
查看>>
换字式密码
查看>>