我正在尝试使用 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/返回空。有没有办法不添加斜线?谢谢!
主机站点似乎有一些错误。有两种方法可以解决这些问题,但是如果主机站点是您的代码,那么您应该只修复服务器代码中的那些错误。
如果您切换到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()
option 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
出于某些原因,我不了解浏览器,获得了https://api.umd.io/v0/courses?dept_id=math
一个正确的 URL的 307 重定向。我不知道为什么 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,导致服务器错误在某种程度上意外工作。我不会认为它是一种可靠的解决方法,将来可能不会意外中断。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句