http.Agent 类

http.ClientRequest 类

当调用http.request方法时返回

request.write(chunk: string| Buffer [, encoding: string][, callback:function])

发送一个请求主体的数据块。 通过多次调用此方法,可以将请求主体发送到服务器,在这种情况下,建议在创建请求时使用 ['Transfer-Encoding', 'chunked'] 请求头行。

如果将整个数据成功刷新到内核缓冲区,则返回 true。 如果全部或部分数据在用户内存中排队,则返回 false。 当缓冲区再次空闲时,则触发 'drain' 事件。
当使用空字符串或 buffer 调用 write 函数时,则什么也不做且等待更多输入。

入参

chunk |

请求主体

encoding

默认为’utf8’

callback

参数是可选的,当刷新此数据块时调用,但仅当数据块非空时才会调用。

返回

  1. const http = require('http');
  2. const options = {
  3. "method":"post",
  4. }
  5. const url = 'http://127.0.0.1/www/enum_select';
  6. const request = http.request(url, options, (res)=>{
  7. res.setEncoding('utf8');
  8. res.on('data', (chunk) => {
  9. console.log(chunk);
  10. });
  11. res.on('end', ()=>{
  12. console.log('==========end==========')
  13. });
  14. });
  15. request.setHeader('Content-Type', 'application/json');
  16. request.write('{"id":1}', (error)=>{
  17. console.log(error);
  18. });
  19. request.end();

request.getHeader(name: string) 略

request.setHeader(name: string, value: string) 略

request.removeHeader(name: string) 略

request.end([data[, encoding]][, callback])

完成发送请求。 如果部分请求主体还未发送,则将它们刷新到流中。 如果请求被分块,则发送终止符 '0\r\n\r\n'
入参
data |
encoding
callback
返回:
如果指定了 data,则相当于调用 request.write(data, encoding) 之后再调用 request.end(callback)
如果指定了 callback,则当请求流完成时将调用它。

request.flushHeaders()

刷新请求头。
出于效率原因,Node.js 通常会缓冲请求头,直到调用 request.end() 或写入第一个请求数据块。 然后,它尝试将请求头和数据打包到单个 TCP 数据包中。
这通常是期望的(它节省了 TCP 往返),但是可能很晚才发送第一个数据。 request.flushHeaders() 绕过优化并启动请求。

request.setNoDelay([noDelay:boolean]) ???

一旦将套接字分配给此请求并且连接了套接字,就会调用 socket.setNoDelay()

request.setSocketKeepAlive([enable:boolean][, initialdelay:number])

一旦将套接字分配给此请求并连接了套接字,就会调用 socket.setKeepAlive()

request.setTimeout(timeout:number[, callback:function])

  • 返回:

一旦将套接字分配给此请求并且连接了套接字,就会调用 socket.setTimeout()

request.abort()

将请求标记为中止。 调用此方法将导致响应中剩余的数据被丢弃并且套接字被销毁。

事件

‘response’ 事件

当收到此请求的响应时触发。 此事件仅触发一次。

  1. ...略
  2. const req = http.request(options);
  3. req.on('response', (res: <http.IncomingMessage>) => {
  4. // ...
  5. });

‘socket’ 事件

  • socket
  • 将套接字分配给此请求后触发。

    ‘timeout’ 事件

    当底层套接字因不活动而超时时触发。 这只会通知套接字已空闲。 必须手动中止请求。另请参见:request.setTimeout()

    ‘upgrade’ 事件

  • response

  • socket
  • head

每次服务器响应升级请求时发出。 如果未监听此事件且响应状态码为 101 Switching Protocols,则接收升级响应头的客户端将关闭其连接。

  1. const http = require('http');
  2. // 创建 HTTP 服务器。
  3. const srv = http.createServer( (req, res) => {
  4. res.writeHead(200, { 'Content-Type': 'text/plain' });
  5. res.end('响应内容');
  6. });
  7. srv.on('upgrade', (req, socket, head) => {
  8. socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
  9. 'Upgrade: WebSocket\r\n' +
  10. 'Connection: Upgrade\r\n' +
  11. '\r\n');
  12. socket.pipe(socket);
  13. });
  14. // 服务器正在运行。
  15. srv.listen(1337, '127.0.0.1', () => {
  16. // 发送请求。
  17. const options = {
  18. port: 1337,
  19. host: '127.0.0.1',
  20. headers: {
  21. 'Connection': 'Upgrade',
  22. 'Upgrade': 'websocket'
  23. }
  24. };
  25. const req = http.request(options);
  26. req.end();
  27. req.on('upgrade', (res, socket, upgradeHead) => {
  28. console.log('接收到响应');
  29. socket.end();
  30. process.exit(0);
  31. });
  32. });

‘connect’ 事件

  1. target.on('connect', (
  2. response :<http.IncomingMessage>,
  3. socket :<net.Socket>,
  4. head :<Buffer>
  5. ) => {
  6. // ...
  7. })

每次服务器使用 CONNECT 方法响应请求时都会触发。 如果未监听此事件,则接收 CONNECT 方法的客户端将关闭其连接。

  1. const http = require('http');
  2. const net = require('net');
  3. const url = require('url');
  4. // 创建 HTTP 隧道代理。
  5. const proxy = http.createServer((req, res) => {
  6. res.writeHead(200, { 'Content-Type': 'text/plain' });
  7. res.end('响应内容');
  8. });
  9. proxy.on('connect', (req, cltSocket, head) => {
  10. // 连接到原始服务器。
  11. const srvUrl = url.parse(`http://${req.url}`);
  12. const srvSocket = net.connect(srvUrl.port, srvUrl.hostname, () => {
  13. cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
  14. 'Proxy-agent: Node.js-Proxy\r\n' +
  15. '\r\n');
  16. srvSocket.write(head);
  17. srvSocket.pipe(cltSocket);
  18. cltSocket.pipe(srvSocket);
  19. });
  20. });
  21. // 代理正在运行。
  22. proxy.listen(1337, '127.0.0.1', () => {
  23. // 向隧道代理发出请求。
  24. const options = {
  25. port: 1337,
  26. host: '127.0.0.1',
  27. method: 'CONNECT',
  28. path: 'nodejs.cn:80'
  29. };
  30. const req = http.request(options);
  31. req.end();
  32. req.on('connect', (res, socket, head) => {
  33. console.log('已连接');
  34. // 通过 HTTP 隧道发出请求。
  35. socket.write('GET / HTTP/1.1\r\n' +
  36. 'Host: nodejs.cn:80\r\n' +
  37. 'Connection: close\r\n' +
  38. '\r\n');
  39. socket.on('data', (chunk) => {
  40. console.log(chunk.toString());
  41. });
  42. socket.on('end', () => {
  43. proxy.close();
  44. });
  45. });
  46. });

‘abort’ 事件 ???

当请求被客户端中止时触发。 此事件仅在第一次调用 abort() 时触发。

‘continue’ 事件 ???

当服务器发送 100 Continue HTTP 响应时触发,通常是因为请求包含 Expect: 100-continue。 这是客户端应发送请求主体的指令。

‘information’ 事件 ???

服务器发送 1xx 响应时触发(不包括 101 Upgrade)。 使用包含具有状态码的对象的回调触发此事件。

  1. const http = require('http');
  2. const options = {
  3. host: '127.0.0.1',
  4. port: 8080,
  5. path: '/length_request'
  6. };
  7. // 发出请求。
  8. const req = http.request(options);
  9. req.end();
  10. req.on('information', (res) => {
  11. console.log(`获得主响应之前的信息: ${res.statusCode}`);
  12. });
  13. 0 - (未初始化)还没有调用send()方法
  14. 1 - (载入)已调用send()方法,正在发送请求
  15. 2 - (载入完成)send()方法执行完成,
  16. 3 - (交互)正在解析响应内容
  17. 4 - (完成)响应内容解析完成,可以在客户端调用了
  18. 100——客户必须继续发出请求
  19. 101——客户要求服务器根据请求转换HTTP协议版本

属性

request.aborted :number

如果请求已中止,则此值是请求中止的时间,自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。

request.connection

请参阅 request.socket

request.finished :boolean

如果调用了 request.end(),则 request.finished 属性将为 true

request.maxHeadersCount :number

限制最大响应头数。 如果设置为 0,则不会应用任何限制。
默认为2000

request.socket

指向底层套接字。 通常用户无需访问此属性。 特别是,由于协议解析器附加到套接字的方式,套接字将不会触发 ‘readable’ 事件。 也可以通过 request.connection 访问 socket。

  1. const http = require('http');
  2. const options = {
  3. host: 'nodejs.cn',
  4. };
  5. const req = http.get(options);
  6. req.end();
  7. req.once('response', (res) => {
  8. const ip = req.socket.localAddress;
  9. const port = req.socket.localPort;
  10. console.log(`您的 IP 地址是 ${ip},源端口是 ${port}`);
  11. // 使用响应对象。
  12. });

http.Server 类

http.ServerResponse 类

http.IncomingMessage 类