如何使用node.js发送HTTP/2.0请求

8

如何在Node.js中发送HTTP版本2.0的请求?

我已经尝试了几乎所有可用的请求模块,但它们都是HTTP版本1.1。


内置的问题在哪里?https://nodejs.org/api/http2.html - Brad
示例代码可以在Node.js核心文档中找到:https://nodejs.org/api/http2.html#http2_client_side_example - slebetman
3个回答

9

GET 请求:

const http2 = require("http2");
const client = http2.connect("https://www.google.com");

const req = client.request({
 ":path": "/"
});

let data = "";

req.on("response", (headers, flags) => {
 for (const name in headers) {
  console.log(`${name}: ${headers[name]}`);
 }

});

req.on("data", chunk => {
 data += chunk;
});
req.on("end", () => {
 console.log(data);
 client.close();
});
req.end();

POST请求

     let res = "";
      let postbody = JSON.stringify({
       key: value
      });
      let baseurl = 'baseurl'
      let path = '/any-path'
      const client = http2.connect(baseurl);
      const req = client.request({
       ":method": "POST",
       ":path": path,
       "content-type": "application/json",
       "content-length": Buffer.byteLength(postbody),
      });


      req.on("response", (headers, flags) => {
       for (const name in headers) {
        console.log(`${name}: ${headers[name]}`);
       }

      });
      req.on("data", chunk => {
       res = res + chunk;
      });
      req.on("end", () => {
       client.close();
      });

   req.end(postbody)

更多详细信息请参阅官方文档:https://nodejs.org/api/http2.html#http2_client_side_example


我该如何接收所有的头信息? - Hobey823
好的答案。根据后端需要,您可能需要更改content-type头为application/x-www-form-urlencoded或其他内容。重要的是使用content-length和req.end将body/data发送。另一方面,您可能需要通过set-cookie头在“response”回调中手动添加cookie支持。 - DLara

1
自从Node.js 8.4.0版本推出后,您可以使用内置的http2模块实现http2服务器。或者如果您想在Express中使用http2,可以使用npm上的一个很棒的模块:spdy
以下是来自express-spdy的一些代码:
const fs = require('fs');
const path = require('path');
const express = require('express');
const spdy = require('spdy');

const CERTS_ROOT = '../../certs/';

const app = express();

app.use(express.static('static'));

const config = {
    cert: fs.readFileSync(path.resolve(CERTS_ROOT, 'server.crt')),
    key: fs.readFileSync(path.resolve(CERTS_ROOT, 'server.key')),
};

spdy.createServer(config, app).listen(3000, (err) => {
    if (err) {
        console.error('An error occured', error);
        return;
    }

    console.log('Server listening on https://localhost:3000.')
});

2
第一句话是正确的,但是回答的其余部分与问题无关。他在寻找的是一个http2客户端,而不是服务端。 - slebetman
我不是在寻找一个HTTP/2.0服务器。我正在寻找一种向google.com发送HTTP/2.0请求的方法。 - Hobey823

0

只是为了添加更多的注释,因为这是在使用HTTP2时针对具有多个请求的同一端点的主要考虑点

var payload1 = JSON.stringify({});
var payload2 = JSON.stringify({});

const client = http2.connect('server url');
const request = client.request({
  ":method": "POST",
  ':path': 'some path',
  'authorization': `bearer ${token}`,
  "content-type": "application/json",
});

request.on('response', (headers, flags) => {
  for (const name in headers) {
    console.log(`${name}: ${headers[name]}`);
  }
});
request.setEncoding('utf8');
let data = ''
request.on('data', (chunk) => { data += chunk; });
request.on('end', () => {
  console.log(`\n${data}`);
  client.close();
});
// send as many request you want and then close the connection
request.write(payload1)
request.write(payload2)
request.end();

希望能帮助到某人。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接