我正在尝试使用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/,该请求返回空。有没有办法不添加斜线?谢谢!
答案 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)
该主机站点似乎存在一些错误。有两种方法可以解决这些问题,但是,如果宿主站点是您的代码,则应该只修复服务器代码中的那些错误。
如果您切换到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末尾的错误重定向。这可能是一个安全的解决方法。
如果在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。我认为这不是一个将来可能不会意外中断的可靠解决方法。