作为前端你得懂点NodeJS——HTTP模块

262 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

HTTP

HTTP 核心模块是 Node.js 网络的关键模块。它提供了HTTP网络请求相关的属性、方法、以及类。

创建HTTP服务

我们可以使用 http.createServer()我们可以创建一个server来接收客户端发来的HTTP请求。

const server = http.createServer((req, res) => {
  //在这个回调中,我们可以读取请求参数req,也可以设置返回结果res。
})

发起HTTP请求

http.request() :发送 HTTP 请求到服务器,并创建 http.ClientRequest 类的实例 http.get() : 类似于 http.request(),但会自动地设置 HTTP 方法为 GET,并自动地调用 req.end()

http.Agent

Node.js 会创建 http.Agent 类的全局实例,以管理 HTTP 客户端连接的持久性和复用,这是 Node.js HTTP 网络的关键组成部分。

该对象会确保对服务器的每个请求进行排队并且单个 socket 被复用。

它还维护一个 socket 池。 出于性能原因,这是关键。

http.ClientRequest

当 http.request() 或 http.get() 被调用时,会创建 http.ClientRequest 对象。

当响应被接收时,则会使用响应(http.IncomingMessage 实例作为参数)来调用 response 事件。

返回的响应数据可以通过以下两种方式读取:

  • 可以调用 response.read() 方法。
  • 在 response 事件处理函数中,可以为 data 事件设置事件监听器,以便可以监听流入的数据。

http.Server

当使用 http.createServer() 创建新的服务器时,通常会实例化并返回此类。

拥有服务器对象后,就可以访问其方法:

  • close() 停止服务器不再接受新的连接。
  • listen() 启动 HTTP 服务器并监听连接。

http.ServerResponse

由 http.Server 创建,并作为第二个参数回传给触发它的 request 事件。这就是我们常说的“响应” response

通常在代码中写作 res

const server = http.createServer((req, res) => {
  //res 是一个 http.ServerResponse 对象。
  
  //获取已设置的 HTTP response 头信息中的名称的列表
  const headerNames = res.getHeaderNames();
  
  //获取已设置的 HTTP 消息头的副本。
  const headers = getHeaders();
  
  //设置名为headername的header的值
  res.setHeader('headername', value)
  
  //获取已设置的某个header的值
  const headerValue = res.getHeader('headername');
  
  //删除已设置的 HTTP 消息头
  res.removeHeader('headername');
  
  //判断res响应是否设置了'headername' 的header值
  const hasHeader = res.hasHeader('headername');
  
  //判断消息头是否已被发送给客户端
  const hasSend = headersSent()
  
  //一定要调用否则客户端会一直等待,直到超时
  res.end()
  
})

HTTP协议响应码

编码含义
100继续
101交换协议
200成功返回
201创建成功
202接受
203未认证的信息
204无内容
205重制内容
206部分内容
300多种选择
301被请求的资源已永久移动到新位置,需要重定向
302要求客户端执行临时重定向
303寻找其他资源
305使用代理
400坏请求,一般是客户端请求代码设置有误
401未认证状态、token失效
402被创建最初目的是用于数字现金或微型支付系统, 表明客户端请求的内容只有付费之后才能获取
403被禁止
404未发现服务
405方法不被允许:类似GET、POST这种
414URL太长
415不支持的多媒体格式
500服务器错误
511未网络认证

  '405': 'Method Not Allowed',
  '406': 'Not Acceptable',
  '407': 'Proxy Authentication Required',
  '408': 'Request Timeout',
  '409': 'Conflict',
  '410': 'Gone',
  '411': 'Length Required',
  '412': 'Precondition Failed',
  '413': 'Payload Too Large',
  '414': 'URI Too Long',
  '415': 'Unsupported Media Type',
  '416': 'Range Not Satisfiable',
  '417': 'Expectation Failed',
  '418': 'I'm a teapot',
  '421': 'Misdirected Request',
  '422': 'Unprocessable Entity',
  '423': 'Locked',
  '424': 'Failed Dependency',
  '425': 'Unordered Collection',
  '426': 'Upgrade Required',
  '428': 'Precondition Required',
  '429': 'Too Many Requests',
  '431': 'Request Header Fields Too Large',
  '451': 'Unavailable For Legal Reasons',
  '500': 'Internal Server Error',
  '501': 'Not Implemented',
  '502': 'Bad Gateway',
  '503': 'Service Unavailable',
  '504': 'Gateway Timeout',
  '505': 'HTTP Version Not Supported',
  '506': 'Variant Also Negotiates',
  '507': 'Insufficient Storage',
  '508': 'Loop Detected',
  '509': 'Bandwidth Limit Exceeded',
  '510': 'Not Extended',
  '511': 'Network Authentication Required'

以下这些方法用于与 HTTP 消息头进行交互:

在处理消息头之后,可以通过调用 response.writeHead()(该方法接受 statusCode 作为第一个参数,可选的状态消息和消息头对象)将它们发送给客户端。

若要在响应正文中发送数据给客户端,则使用 write()。 它会发送缓冲的数据到 HTTP 响应流。

如果消息头还未被发送,则使用 response.writeHead() 会先发送消息头,其中包含在请求中已被设置的状态码和消息,可以通过设置 statusCode 和 statusMessage 属性的值进行编辑:

JS
response.statusCode = 500
response.statusMessage = '内部服务器错误'

http.IncomingMessage

http.IncomingMessage 对象可通过以下方式创建:

  • http.Server,当监听 request 事件时。
  • http.ClientRequest,当监听 response 事件时。

它可以用来访问响应:

  • 使用 statusCode 和 statusMessage 方法来访问状态。
  • 使用 headers 方法或 rawHeaders 来访问消息头。
  • 使用 method 方法来访问 HTTP 方法。
  • 使用 httpVersion 方法来访问 HTTP 版本。
  • 使用 url 方法来访问 URL。
  • 使用 socket 方法来访问底层的 socket。

因为 http.IncomingMessage 实现了可读流接口,因此数据可以使用流访问。