模拟请求
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.request
const 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 方法列表。返回