Node.js请求功能在URL中添加斜杠

时间:2018-08-30 22:58:07

标签: node.js url request

我正在尝试使用node.js来调用https://api.umd.io/v0/courses?dept_id=math,但是当我这样调用请求函数时:

var request = require('request');
request('http://api.umd.io/v0/courses?dept_id=math', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
...

添加了一个斜杠,使请求转到https://api.umd.io/v0/courses?dept_id=math/,该请求返回空。有没有办法不添加斜线?谢谢!

2 个答案:

答案 0 :(得分:0)

在网址末尾添加一个&符号,如下所示:

var request = require('request');
request('http://api.umd.io/v0/courses?dept_id=math&', function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
})

这是在全新的npm请求安装上进行的测试。我可以通过将错误排除在外而复制它。

答案 1 :(得分:0)

该主机站点似乎存在一些错误。有两种方法可以解决这些问题,但是,如果宿主站点是您的代码,则应该只修复服务器代码中的那些错误。

  1. 如果您切换到https,则可以使用。我注意到了这一点,因为如果您在浏览器中输入http://api.umd.io/v0/courses?dept_id=math,它将重定向到https://api.umd.io/v0/courses?dept_id=math并且可以工作。在浏览器的“网络”标签中,有一个307响应,其中包含重定向到URL的https版本。 node.js还获得了重定向,但与浏览器重定向不同(下文有更多介绍)。因此,切换到https可以避免将/添加到URL末尾的错误重定向。这可能是一个安全的解决方法。

  2. 如果在URL的末尾添加&,则URL的常规http版本将起作用。这清楚地表明,它是某种导致问题的服务器URL解析错误。这可能不是一个特别安全的解决方法,因为重定向的URL起作用是偶然的(请参见下面的讨论)。


当我在自己的node.js应用程序中进行进一步调查时,我发现如果您设置了request()选项followRedirect: false,那么您可以确切地看到正在发生的重定向。在这种情况下,它会为您提供301重定向到https://api.umd.io/v0/courses?dept_id=math/,并在最后加上斜杠。这只是一个普通的服务器错误。您将必须在服务器中修复此问题,或者使用上述解决方法之一。

所有这些都已经在一个简单的node.js测试应用程序中得到了验证。对于重定向,看来服务器正在以某种方式检测到它是浏览器,并且如果重定向器是浏览器,则发送重定向,但不在您的node.js代码中。我看过浏览器,只有四个标头随请求一起发送:

DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id: CD54EC492DF97F6357AFC5465E6D6D0C

出于某种原因,我不理解浏览器,将307重定向到https://api.umd.io/v0/courses?dept_id=math,这是一个正确的URL。我不知道为什么node.js会将301重定向到错误的URL,而浏览器将307重定向到正确的URL。我尝试模拟浏览器发送的所有标头,但仍然将301传递到错误的URL。


无论如何,您可以从node.js中使用两种可能的解决方法。有趣的是,在末尾添加&仍然会获得重定向,而在末尾添加了/,就像这样:

https://api.umd.io/v0/courses?dept_id=math&/

,但是使用该重定向URL实际上可能有效,因为&触发了URL解析,将/放入URL的另一个xxx = yy段中,并将其与dept_id=math段分开这样就不会搞砸了。这表明添加&只是一种导致服务器错误在某种程度上偶然起作用的hack。我认为这不是一个将来可能不会意外中断的可靠解决方法。