使用Postman可以正常工作,但使用Ajax却无法正常工作?

7

我正在尝试从托管某些账户数据的服务器进行简单的GET请求。该请求需要授权标头才能正确运行。我已经在Postman中执行了GET请求并成功地检索到了数据,但是尝试通过Ajax在Javascript中执行此操作会导致"无效的HTTP状态代码405"错误。

以下是一个指向fiddle和Postman设置截图的链接。谢谢!

$.ajax({
    beforeSend: function(xhrObj){
            xhrObj.setRequestHeader("Authorization","Bearer tj7LTLycpQC6DRup5BkHUO7uVbYaAZI40");
    },
    type: "GET",
    url: "https://api05.iq.questrade.com/v1/accounts",
    success: function(e){
            console.log(e)
    }
});

点击此处查看代码示例。

POSTMAN设置

2个回答

11

来自Chrome的JS控制台:

加载资源失败:服务器返回状态码为405(方法不允许)

由于您添加了Authorization头,因此您已使请求变得复杂。这需要浏览器进行预检OPTIONS请求以请求发送复杂请求的权限。

您发出请求的服务器正在回复说该URL不允许OPTIONS请求。

您需要修改服务器,以便对预检CORS请求做出适当的响应。


Postman无需进行预检请求,因为您的浏览器信任Postman的代码。它不知道是否可以信任从JSFiddle(也就是潜在的恶意黑客网站)接收到的代码与数据api05.iq.questrade.com(也就是潜在的在线银行或公司内部网站)愿意与之共享。


如果我没有服务器访问权限,那我就没戏了吗? - thebighoncho
@dgalati54 - 就直接使用Ajax进行请求而言:是的。 - Quentin

1

看一下控制台错误:

XMLHttpRequest cannot load https://api05.iq.questrade.com/v1/accounts.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://fiddle.jshell.net' is therefore not allowed access. The response had HTTP status code 405.

这是CORS问题。如果浏览器发送的域名与运行代码的域名不匹配,浏览器会向服务器发送OPTIONS预检请求。您还必须在响应中添加所需的标头。
您必须修改服务器以处理此问题。
您也可以使用JSONP作为替代方案。

“你也可以使用JSONP作为替代方案” — 不行,不行。JSONP根本不允许设置HTTP头。 - Quentin
是的,你说得对。我指的是整个解决方案的替代方案。 - Xeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接