模拟请求

  1. const http = require('http')
  2. const https = require('https')
  3. const fs = require('fs')
  4. function requireHTTP(url, options, httpRequire) {
  5. return new Promise((resolve, reject) => {
  6. const request = url.includes('https://') ? https.request : http.request
  7. const req = request(url, options, (res) => {
  8. let data = ''
  9. res.setEncoding('utf8');
  10. res.on('data', (chunk) => { // data 事件在callbackFn里面
  11. // console.log(chunk);
  12. data += chunk
  13. });
  14. res.on('end', ()=>{ // end 事件在callbackFn里面
  15. resolve(data)
  16. });
  17. });
  18. req.on('error', (e) => {
  19. reject(e)
  20. console.log('error', e.message);
  21. });
  22. req.end();
  23. })
  24. }
  25. module.exports = {
  26. requireHTTP
  27. }

http.request(url[, options][, callback])

可以发起一个请求。

入参数

url参数

url参数可选,如果没有会到options里去查找,如果有就合并options属性,options属性存在,优先级高于url。

options
  1. {
  2. "protocol":"http", //协议,默认值是http
  3. "host":"www.baidu.com", // 域名或地址, 默认值是localhost
  4. /*
  5. host 的别名。为了支持 url.parse(),
  6. 如果同时指定 host 和 hostname,则使用 hostname。
  7. */
  8. "hostname": "www.baidu.com",
  9. /*
  10. family <number> 当解析 host 或 hostname 时使用的 IP 地址族。
  11. 有效值为 4 或 6。如果没有指定,则同时使用 IP v4 和 v6
  12. */
  13. // family: 4,
  14. "method":"post", // 请求方式
  15. "port": 80, // 端口号,默认为80
  16. "localAddress": "", // 为网络连接绑定的本地接口
  17. /*
  18. Unix 域套接字。如果指定了 host 或 port 之一(它们指定了 TCP 套接字),则不能使用此选项。
  19. */
  20. // "socketPath": "",
  21. /*
  22. 请求的路径。应包括查询字符串(如果有)。例如 '/index.html?page=12'。
  23. 当请求的路径包含非法的字符时,
  24. 则抛出异常。目前只有空格被拒绝,但未来可能会有所变化。默认值: '/'。
  25. */
  26. "path":"/"
  27. "headers": { // headers
  28. }
  29. "auth": "" // 基本的身份验证,即 'user:password',用于计算授权请求头。
  30. /*
  31. agent <http.Agent> | <boolean> 控制 Agent 的行为。可能的值有:
  32. undefined (默认): 对此主机和端口使用 http.globalAgent。
  33. Agent 对象: 显式地使用传入的 Agent。
  34. false: 使用新建的具有默认值的 Agent。
  35. */
  36. // "agent": <http.Agent> | <boolean>
  37. /*
  38. createConnection <Function> 当 agent 选项未被使用时,用来为请求生成套接字或流的函数。
  39. 这可用于避免创建自定义的 Agent 类以覆盖默认的 createConnection 函数。
  40. 详见 agent.createConnection()。任何双工流都是有效的返回值。
  41. */
  42. // createConnection <Function>
  43. "timeout": 20000, // 指定套接字超时的数值,以毫秒为单位。这会在套接字被连接之前设置超时。
  44. "setHost":"true", // 指定是否自动添加 Host 请求头。默认值: true。
  45. }

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])

创建一个web服务

入参

options
  • IncomingMessage 指定要使用的 IncomingMessage 类。用于扩展原始的 IncomingMessage默认值:IncomingMessage
  • ServerResponse 指定要使用的 ServerResponse 类。用于扩展原始 ServerResponse默认值:ServerResponse

    requestListener

    return

    http.STATUS_CODES

    所有标准 HTTP 响应状态码的集合,以及每个状态码的简短描述。 例如, http.STATUS_CODES[404] === 'Not Found'

    返回

    http.METHODS

    解析器支持的 HTTP 方法列表。

    返回