javascript-标头失败的AJAX请求

我正在尝试对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 api with angular

Zomato似乎对浏览器不友好,但是需要从您没有CORS限制的服务器进行访问.

仅供参考,从Zomato返回的错误是501,这表示未对OPTIONS命令执行.因此,看起来不仅不是密钥不是通过OPTIONS命令发送的,而且Zomato不支持OPTIONS命令,但这是在浏览器的跨域请求中使用自定义标头所必需的.

相关文章

IE6是一个非常老旧的网页浏览器,虽然现在很少人再使用它,但...
PHP中的count()函数是用来计算数组或容器中元素的个数。这个...
使用 AJAX(Asynchronous JavaScript and XML)技术可以在不...
Ajax(Asynchronous JavaScript and XML)是一种用于改进网页...
本文将介绍如何通过AJAX下载Excel文件流。通过AJAX,我们可以...
Ajax是一种用于客户端和服务器之间的异步通信技术。通过Ajax...