持续创作,加速成长!这是我参与「掘金日新计划 · 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这种 |
| 414 | URL太长 |
| 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 实现了可读流接口,因此数据可以使用流访问。