【问题标题】:Node.js request directly to URL with options (http or https)Node.js 使用选项(http 或 https)直接向 URL 请求
【发布时间】:2013-07-23 16:18:16
【问题描述】:

我想我遗漏了一些关于 http 和 https 请求的内容

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

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

我想知道是否有一种简单的方法可以向该 URI 发出请求以获取数据

要发出 http(s)Request,我现在要做的就是:

  1. 测试 URL 是 http 还是 https 以发出适当的请求
  2. 删除 http(s):// 部分并将结果放入变量中(如果我在主机名中指定 http 或 https,则会出现错误)
  3. 将主机名与路径分开:website.com 和 `/a/b/file.html
  4. 将此变量放入选项对象中

这是必须的还是它们更简单的解决方案不涉及获取主机名和路径,以及测试站点是在 http 还是 https 中?

编辑:我不能使用 http.get 因为我需要放置一些特定的选项

【问题讨论】:

    标签: node.js http https


    【解决方案1】:

    为了从 URL 中获取所有组件,您需要对其进行解析。 Node 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) => {...
    

    【讨论】:

    • 它们是一种发出与协议无关的请求(http 和 https)的方法吗?
    • 它将解析 URL 并为您提供protocol 变量。尽管如此,如果您需要两个单独的请求 - 您必须分别提出它们。
    • 协议包含:,因此使用此代码您最终将始终请求https。也错过了查询字符串。查看我的回答,如果有问题请告诉我
    【解决方案2】:

    对于那些在此处结束的,protocol 包括:,而pathname 不包括search,因此必须手动添加。不需要解析参数,因为它们不需要(这样可以节省计算时间:)

    另外,在函数内部进行 require 并不是真正的最佳实践,并且可能这段代码最终会在函数内部进行,因此进行了所有这些改进,所以我会重写这样的答案:

    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) => { ...
    

    【讨论】:

      猜你喜欢
      • 2016-12-07
      • 2020-02-02
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 2016-08-04
      • 2014-07-29
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多