模拟请求
const http = require('http')const https = require('https')const fs = require('fs')function requireHTTP(url, options, httpRequire) {return new Promise((resolve, reject) => {const request = url.includes('https://') ? https.request : http.requestconst req = request(url, options, (res) => {let data = ''res.setEncoding('utf8');res.on('data', (chunk) => { // data 事件在callbackFn里面// console.log(chunk);data += chunk});res.on('end', ()=>{ // end 事件在callbackFn里面resolve(data)});});req.on('error', (e) => {reject(e)console.log('error', e.message);});req.end();})}module.exports = {requireHTTP}
http.request(url[, options][, callback])
入参数
url参数
url参数可选,如果没有会到options里去查找,如果有就合并options属性,options属性存在,优先级高于url。
options{ "protocol":"http", //协议,默认值是http "host":"www.baidu.com", // 域名或地址, 默认值是localhost /* host 的别名。为了支持 url.parse(), 如果同时指定 host 和 hostname,则使用 hostname。 */ "hostname": "www.baidu.com", /* family <number> 当解析 host 或 hostname 时使用的 IP 地址族。 有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6 */ // family: 4, "method":"post", // 请求方式 "port": 80, // 端口号,默认为80 "localAddress": "", // 为网络连接绑定的本地接口 /* Unix 域套接字。如果指定了 host 或 port 之一(它们指定了 TCP 套接字),则不能使用此选项。 */ // "socketPath": "", /* 请求的路径。应包括查询字符串(如果有)。例如 '/index.html?page=12'。 当请求的路径包含非法的字符时, 则抛出异常。目前只有空格被拒绝,但未来可能会有所变化。默认值: '/'。 */ "path":"/" "headers": { // headers } "auth": "" // 基本的身份验证,即 'user:password',用于计算授权请求头。 /* agent <http.Agent> | <boolean> 控制 Agent 的行为。可能的值有: undefined (默认): 对此主机和端口使用 http.globalAgent。 Agent 对象: 显式地使用传入的 Agent。 false: 使用新建的具有默认值的 Agent。 */ // "agent": <http.Agent> | <boolean> /* createConnection <Function> 当 agent 选项未被使用时,用来为请求生成套接字或流的函数。 这可用于避免创建自定义的 Agent 类以覆盖默认的 createConnection 函数。 详见 agent.createConnection()。任何双工流都是有效的返回值。 */ // createConnection <Function> "timeout": 20000, // 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。 "setHost":"true", // 指定是否自动添加 Host 请求头。默认值: true。}
callback
返回值
注意
req.end()方法必须被调用
使用 http.request() 时,必须始终调用 req.end() 来表示请求的结束,即使没有数据被写入请求主体。
如果在请求期间遇到任何错误(DNS 解析错误、TCP 层的错误、或实际的 HTTP 解析错误),则会在返回的请求对象上触发 'error' 事件。 与所有 'error' 事件一样,如果没有注册监听器,则会抛出错误。
请求头的注意项
- 发送
'Connection: keep-alive' 会通知 Node.js 与服务器的连接应该持续到下一个请求。 - 发送
'Content-Length' 请求头会禁用默认的分块编码。 - 发送
'Expect' 请求头会立即发送请求头。通常情况下,当发送 'Expect: 100-continue' 时,应设置超时时间和 'continue' 事件的监听器。 - 发送授权请求头会使用
auth 选项覆盖以计算基本的身份验证。
```
const options = new URL(‘http://abc:xyz@nodejs.cn‘);
const req = http.request(options, (res) => {
// …
});
```
事件流
在成功的请求中,会按以下顺序触发以下事件:
'socket' 事件'response'事件
res 对象上任意次数的 'data' 事件(如果响应主体为空,则根本不会触发 'data' 事件,例如在大多数重定向中)res 对象上的 'end' 事件
'close' 事件
如果出现连接错误,则触发以下事件:
'socket' 事件'error' 事件'close' 事件
如果在连接成功之前调用 req.abort(),则按以下顺序触发以下事件:
'socket' 事件- (在这里调用
req.abort()) 'abort' 事件'error' 事件并带上错误信息 'Error: socket hang up' 和错误码 'ECONNRESET''close' 事件
如果在响应被接收之后调用 req.abort(),则按以下顺序触发以下事件:
'socket' 事件'response'事件
res 对象上任意次数的 'data' 事件
- (在这里调用
req.abort()) 'abort' 事件res 对象上的 'aborted' 事件'close' 事件res 对象上的 'end' 事件res 对象上的 'close' 事件
注意,设置 timeout 选项或使用 setTimeout() 函数不会中止请求或执行除添加 'timeout' 事件之外的任何操作。
http.maxHeaderSize
只读属性,指定 HTTP 消息头的最大允许大小(以字节为单位)。 默认为 8KB。 可使用 [--max-http-header-size](http://nodejs.cn/s/HfsyuU) 命令行选项进行配置。
返回
http.globalAgent
Agent 的全局实例,作为所有 HTTP 客户端请求的默认值。
返回
http.get(url[, options][, callback])
与http.request作用,参数和返回值一致,唯一区别是它将方法设置为 GET 并自动调用 req.end()。
http.createServer([options][, requestlistener])
入参
options
IncomingMessage 指定要使用的 IncomingMessage 类。用于扩展原始的 IncomingMessage。默认值:IncomingMessage。ServerResponse 指定要使用的 ServerResponse 类。用于扩展原始 ServerResponse。默认值:ServerResponse。
requestListener
return
http.STATUS_CODES
所有标准 HTTP 响应状态码的集合,以及每个状态码的简短描述。 例如, http.STATUS_CODES[404] === 'Not Found'。
返回
http.METHODS
解析器支持的 HTTP 方法列表。
返回
{"protocol":"http", //协议,默认值是http"host":"www.baidu.com", // 域名或地址, 默认值是localhost/*host 的别名。为了支持 url.parse(),如果同时指定 host 和 hostname,则使用 hostname。*/"hostname": "www.baidu.com",/*family <number> 当解析 host 或 hostname 时使用的 IP 地址族。有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6*/// family: 4,"method":"post", // 请求方式"port": 80, // 端口号,默认为80"localAddress": "", // 为网络连接绑定的本地接口/*Unix 域套接字。如果指定了 host 或 port 之一(它们指定了 TCP 套接字),则不能使用此选项。*/// "socketPath": "",/*请求的路径。应包括查询字符串(如果有)。例如 '/index.html?page=12'。当请求的路径包含非法的字符时,则抛出异常。目前只有空格被拒绝,但未来可能会有所变化。默认值: '/'。*/"path":"/""headers": { // headers}"auth": "" // 基本的身份验证,即 'user:password',用于计算授权请求头。/*agent <http.Agent> | <boolean> 控制 Agent 的行为。可能的值有:undefined (默认): 对此主机和端口使用 http.globalAgent。Agent 对象: 显式地使用传入的 Agent。false: 使用新建的具有默认值的 Agent。*/// "agent": <http.Agent> | <boolean>/*createConnection <Function> 当 agent 选项未被使用时,用来为请求生成套接字或流的函数。这可用于避免创建自定义的 Agent 类以覆盖默认的 createConnection 函数。详见 agent.createConnection()。任何双工流都是有效的返回值。*/// createConnection <Function>"timeout": 20000, // 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。"setHost":"true", // 指定是否自动添加 Host 请求头。默认值: true。}
callback
返回值
注意
req.end()方法必须被调用
使用 http.request() 时,必须始终调用 req.end() 来表示请求的结束,即使没有数据被写入请求主体。
如果在请求期间遇到任何错误(DNS 解析错误、TCP 层的错误、或实际的 HTTP 解析错误),则会在返回的请求对象上触发 'error' 事件。 与所有 'error' 事件一样,如果没有注册监听器,则会抛出错误。
请求头的注意项
- 发送
'Connection: keep-alive'会通知 Node.js 与服务器的连接应该持续到下一个请求。 - 发送
'Content-Length'请求头会禁用默认的分块编码。 - 发送
'Expect'请求头会立即发送请求头。通常情况下,当发送'Expect: 100-continue'时,应设置超时时间和'continue'事件的监听器。 - 发送授权请求头会使用
auth选项覆盖以计算基本的身份验证。 ``` const options = new URL(‘http://abc:xyz@nodejs.cn‘);
const req = http.request(options, (res) => { // … }); ```
事件流
在成功的请求中,会按以下顺序触发以下事件:
'socket'事件'response'事件res对象上任意次数的'data'事件(如果响应主体为空,则根本不会触发'data'事件,例如在大多数重定向中)res对象上的'end'事件
'close'事件
如果出现连接错误,则触发以下事件:
'socket'事件'error'事件'close'事件
如果在连接成功之前调用 req.abort(),则按以下顺序触发以下事件:
'socket'事件- (在这里调用
req.abort()) 'abort'事件'error'事件并带上错误信息'Error: socket hang up'和错误码'ECONNRESET''close'事件
如果在响应被接收之后调用 req.abort(),则按以下顺序触发以下事件:
'socket'事件'response'事件res对象上任意次数的'data'事件
- (在这里调用
req.abort()) 'abort'事件res对象上的'aborted'事件'close'事件res对象上的'end'事件res对象上的'close'事件
注意,设置 timeout 选项或使用 setTimeout() 函数不会中止请求或执行除添加 'timeout' 事件之外的任何操作。
http.maxHeaderSize
只读属性,指定 HTTP 消息头的最大允许大小(以字节为单位)。 默认为 8KB。 可使用 [--max-http-header-size](http://nodejs.cn/s/HfsyuU) 命令行选项进行配置。
返回
http.globalAgent
Agent 的全局实例,作为所有 HTTP 客户端请求的默认值。
返回
http.get(url[, options][, callback])
与http.request作用,参数和返回值一致,唯一区别是它将方法设置为 GET 并自动调用 req.end()。
http.createServer([options][, requestlistener])
入参
options
IncomingMessage 指定要使用的 IncomingMessage 类。用于扩展原始的 IncomingMessage。默认值:IncomingMessage。ServerResponse 指定要使用的 ServerResponse 类。用于扩展原始 ServerResponse。默认值:ServerResponse。
requestListener
return
http.STATUS_CODES
所有标准 HTTP 响应状态码的集合,以及每个状态码的简短描述。 例如, http.STATUS_CODES[404] === 'Not Found'。
返回
http.METHODS
解析器支持的 HTTP 方法列表。
返回
IncomingMessage指定要使用的 IncomingMessage类。用于扩展原始的IncomingMessage。默认值:IncomingMessage。ServerResponse指定要使用的 ServerResponse类。用于扩展原始ServerResponse。默认值:ServerResponse。requestListener
return
http.STATUS_CODES
所有标准 HTTP 响应状态码的集合,以及每个状态码的简短描述。 例如,http.STATUS_CODES[404] === 'Not Found'。返回
http.METHODS
解析器支持的 HTTP 方法列表。返回
