6

我想我遗漏了一些关于 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 因为我需要放置一些特定的选项

4

2 回答 2

9

为了从 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) => {...
于 2013-07-24T09:18:54.880 回答
3

对于那些在这里结束的,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) => { ...
于 2019-05-21T16:06:32.423 回答