使用URL对象发送HTTP请求但添加标头

时间:2017-11-08 12:14:32

标签: node.js http url request

我有一个URL对象,我需要在node.js中使用http模块发出请求。

通常我会使用:

const url = new URL('...');  // from third party module

http.request(url)

但我需要在请求中添加标头。

const url = new URL('...');  // from third party module

http.request({
    hostname: url.hostname,
    port: url.port,
    path: url.path,
    method: 'post'
    headers: {...}
});

我猜测是否有一种方法可以将URL对象转换为选项对象,以避免使用遗留的url.parse(不建议使用文档本身)。

  

注意:虽然Legacy API尚未弃用,但它仅用于向后兼容现有应用程序。新的应用程序代码应该使用WHATWG API。

实际上,如何手动执行http.request参数文档中所述的内容:

  

如果是URL对象,它将自动转换为普通选项对象。

如果我对URL对象使用Object.assign,它会在创建的最终对象中公开一些内部,我找到的唯一解决方案是手动提取所需的属性......

这是一个设计缺陷还是我错过了什么?

2 个答案:

答案 0 :(得分:0)

您可以将所有标题信息设为单独的选项

const options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};

&安培;把它传递给你的请求..

const req = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
  res.setEncoding('utf8');
  res.on('data', (chunk) => {
    console.log(`BODY: ${chunk}`);
  });
  res.on('end', () => {
    console.log('No more data in response.');
  });
});

req.on('error', (e) => {
  console.error(`problem with request: ${e.message}`);
});

// write data to request body
req.write(postData);
req.end();

说完我建议你使用axiosrequest这样的第三方npm套餐来制作获取,发布请求

  

Request是一个简化的HTTP客户端,可与Python的请求相媲美   图书馆。这个库比默认的http更加用户友好   模块,并被认为是几个社区的首选   年。

答案 1 :(得分:0)

自节点v10.9.0起,可以分别传递url(字符串或URL实例)和options参数。这是新的函数签名:

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

对于较早的版本,没有直接的方法来合并URL对象和选项。在后台,Node.js converts URL object to options object使用与您类似的方法。