Node.js直接向URL请求选项(http或https)

时间:2013-07-24 09:14:09

标签: node.js http https

我想我错过了关于http和https请求的内容

我有一个包含URL的变量,例如:

http(s)://website.com/a/b/file.html

我想知道是否有一种简单的方法来请求该URI来获取数据

要发出http(s)请求,这就是我现在要做的事情:

  1. 测试网址是http还是https以发出相应的请求
  2. 删除http(s)://部分并将结果放入变量中(如果我在主机名中指定http或https,则会收到错误)
  3. 将主机名与路径分开:website.com和`/a/b/file.html
  4. 将此变量放在选项对象
  5. 这是必须的还是更简单的解决方案,不涉及获取主机名和路径,并测试该网站是否为http或https?

    编辑:我无法使用http.get,因为我需要提供一些特定的选项

2 个答案:

答案 0 :(得分:2)

为了从URL中获取所有组件,您需要解析它。节点v0.10.13具有稳定的模块:url.parse

这是一个简单的例子:

var q = url.parse(urlStr, true);
var protocol = (q.protocol == "http") ? require('http') : require('https');
let options = {
    path:  q.pathname,
    host: q.hostname,
    port: q.port,
};
protocol.get(options, (res) => {...

答案 1 :(得分:0)

对于到此为止的用户,protocol包括:,而pathname不包括search,因此必须手动添加。不应该解析参数,因为它们是不需要的(这样可以节省计算时间:)

在函数内进行请求并不是真正的最佳实践,并且此代码可能最终会在函数内进行,因此进行了所有改进,因此我将答案重写为:

import * as url from 'url';
import * as https from 'https';
import * as http from 'http';

const uri = url.parse(urlStr);
const { request } = uri.protocol === 'https:' ? https : http;
const opts = {
    headers, // Should be defined somewhere...
    method: 'GET',
    hostname: uri.hostname,
    port: uri.port,
    path: `${uri.pathname}${uri.search}`,
    protocol: uri.protocol,
};
const req = request(opts, (resp) => { ...