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

edi*_*999 5 https http node.js

我认为我缺少有关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,因为我需要放置一些特定选项

mok*_*oka 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) => {...
Run Code Online (Sandbox Code Playgroud)

  • 协议包含“:”,因此使用此代码您最终将始终请求“https”。查询字符串也丢失了。查看我的回答,如果有问题请告诉我 (2认同)

Miq*_*uel 5

对于此处结束的内容,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) => { ...
Run Code Online (Sandbox Code Playgroud)