我正在尝试对Yelp Fusion API进行简单的ajax调用。我使用Yelp提供的client_id和client_secret做了一个' POST'调用Postman并根据Yelp API文档接收访问令牌。此访问令牌可用于验证api调用。获得访问令牌后,我使用邮递员来获取访问权限。致电/ business / search端点并获取相关的业务信息。下图显示了进行呼叫所需的相应标头和参数:
Postman Headers, Parameters, and Response
点击' SEND'在Postman中,JSON响应代码显示在Postman(上一个图像的底部),这是我正在寻找的结果。 Postman还有一个功能来生成调用所需的代码,我将生成的ajax请求插入到我的程序中:
var settings = {
"async": true,
"crossDomain": true,
"url": "https://api.yelp.com/v3/businesses/search?term=delis&latitude=37.786882&longitude=-122.399972",
"method": "GET",
"headers": {
"authorization": "Bearer 0P*****************x",
"cache-control": "no-cache",
"postman-token": "30*************7"
},
"data": {
"grant_type": "client_credientials",
"client_secret": "tp***************m",
"client_id": "RO**********w"
}
}
$.ajax(settings).done(function (response) {
console.log(response);
});
现在,当我在页面上单击提交按钮时,我想在控制台中显示响应。但是,虽然Postman似乎能够正确地进行ajax调用并收到正确的响应,但Google Chrome浏览器会显示以下错误:Response for preflight has invalid HTTP status code 500。根据我的理解,当OPTIONS方法向资源发出HTTP请求以确定实际请求是否可以安全发送时,预检请求中会出现第一个错误。但是,我很难理解Postman如何能够毫无问题地拨打电话,但Google Chrome无法解决问题。任何帮助表示赞赏。
答案 0 :(得分:0)
这是一个典型的CORS场景
预检请求是浏览器针对跨域调用发出的HTTP请求,以检查您的域是否具有正确的“权限”来确定实际请求是否可以安全发送
预检请求会双重检查服务器是否设置了某些标头:例如
"Access-Control-Allow-Origin": "*"
"Access-Control-Allow-Methods": "GET, POST"
"Access-Control-Allow-Headers: "X-Custom-Header"
基本上指定了被授予访问权限的域列表,允许方法(获取,放置,发布等)和允许标头。 你没有在Postman中看到这个错误,因为它没有向服务器发出任何预检请求,它只是绕过任何与CORS相关的问题
由于您无法控制Yelp Fusion API后端,因此您可以制作一个简单的后端来发出请求(Cors does not seem to be supported)