【发布时间】:2017-01-07 21:17:18
【问题描述】:
代码转储:
$.ajax({
type: 'GET',
dataType: 'json',
url: api,
xhrFields: {
withCredentials: true
},
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', "Basic [my auth token]");
},
success: function(jd) {
console.log(jd.stringify());
}
});
问题是,当我包含 beforeSend 时,Chrome 和 Firefox 会发送 OPTIONS 预检,但是 API 拒绝了 OPTIONS 请求,因为它不知道如何处理 OPTIONS 请求并将其视为 GET,没有看到授权标头并拒绝请求。
我可以让它工作的唯一方法是强制浏览器不发送 OPTIONS 请求或包含我的标题。我无法修改我正在使用的 API。
如果有人能给我建议,我将不胜感激。
【问题讨论】:
-
OPTIONS 请求在跨域请求之前发送,以确保 CORS 标头在响应中到位。首先,您是否打算提出跨域请求?其次,你对接收服务器有控制权吗?
-
是的,我打算跨域(这是一个 API 请求),不,我无法控制服务器:“我无法修改我正在使用的 API。”
-
在这种情况下,恐怕您尝试做的事情无法通过 JS 代码实现。 OPTIONS 请求失败,因为响应服务器未设置为在响应中发送 CORS 标头,因此他们不允许来自第三方域的 API 请求。相反,您需要在服务器端进行请求。
-
如果您检查控制台,您很可能会看到类似于
“No 'Access-Control-Allow-Origin' header is present on the requested resource”的错误,如果是这样,请查看此问题以了解问题的解释:stackoverflow.com/questions/20035101/…。 -
我知道 API 旨在处理第 3 方请求,因为这就是它的创建目的!它已通过请求令牌等完整记录
标签: javascript jquery ajax http-headers