我正在尝试对https://developers.zomato.com/api/v2.1/search进行AJAX请求,请参见Zomato API
服务器具有标头:
"access-control-allow-methods": "GET, POST, DELETE, PUT, PATCH, OPTIONS",
"access-control-allow-origin": "*"
问题在于该API需要为用户密钥设置其他标题.但是,每当我设置自定义标头时,chrome就会通过向上述URL发送OPTIONS请求来进行飞行前请求,这会失败,因此AJAX请求也会失败.
如果不设置标头,则不会收到CORS错误,而是从服务器发出的禁止错误,因为我没有设置用户键标头.
有什么办法可以解决22局的情况吗?
jQuery和JavaScript方式均失败:
$(document).ready(function () {
$.ajax({
url: 'https://developers.zomato.com/api/v2.1/search',
headers: {
'Accept': 'application/json',
'user_key': 'XXXXX'
},
success: function (data) {
console.log(data);
}
});
});
var xhr = new XMLHttpRequest();
var url = 'https://developers.zomato.com/api/v2.1/search';
xhr.open('GET', url, false);
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('user_key', 'XXXXXX');
xhr.send(null);
if (xhr.status == 200) {
console.log(xhr.responseText);
}
我得到的错误:
OPTIONS https://developers.zomato.com/api/v2.1/search
XMLHttpRequest cannot load https://developers.zomato.com/api/v2.1/search. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access. The response had HTTP status code 501.
如果有人想复制,您可以在这里获得免费的用户密钥:
https://developers.zomato.com/api
解决方法:
从浏览器来看,似乎没有针对此问题的解决方法.如果需要任何自定义标头,则CORS规范要求浏览器使用OPTIONS请求对请求进行预检.而且,当它执行OPTIONS预检时,它不包括您的自定义标头,因为OPTIONS请求的目的是找出允许在请求上发送哪些自定义标头.因此,如果服务器希望它可以通过浏览器运行,则不应该在OPTIONS请求上要求自定义标头.
因此,如果服务器要求将自定义标头包含在OPTIONS请求中,则服务器只是希望浏览器不会发生这种情况.
在此处查看有关此内容的更多描述的相关答案:
jQuery CORS Content-type OPTIONS
Cross Domain AJAX preflighting failing Origin check
How do you send a custom header in a cross-domain (CORS) XMLHttpRequest?
Using CORS for Cross-Domain Ajax Requests
Zomato似乎对浏览器不友好,但是需要从您没有CORS限制的服务器进行访问.
仅供参考,从Zomato返回的错误是501,这表示未对OPTIONS命令执行.因此,看起来不仅不是密钥不是通过OPTIONS命令发送的,而且Zomato不支持OPTIONS命令,但这是在浏览器的跨域请求中使用自定义标头所必需的.