Yelp Api - Axios/ReactJs - 如何编写代码

Posted

技术标签:

【中文标题】Yelp Api - Axios/ReactJs - 如何编写代码【英文标题】:Yelp Api - Axios/ReactJs - how to write code 【发布时间】:2018-10-16 16:19:31 【问题描述】:

想知道你是否可以帮助我。我是 reactjs 新手,不完全确定如何发出 api 请求?

基本上,我正在构建一个应用程序,它使用 Google apis 地理定位来获取当前用户的纬度/经度。

一旦我有了这个 lat 和 lng,我想将它附加到我的 Yelp api 调用中。因此,根据用户的位置,应用程序将从 API 中提取与位置相关的内容/数据。 EG - 如果我在伦敦,我的伦敦 lat/lng 将附加到 api 调用。

我已经完成了整个位置部分的工作。我的应用程序正在存储我的 lat 和 lng。但我不确定如何在 reactjs 中设置 Yelp api 请求。我正在做这个客户端。这是我目前拥有的代码:

getYelp = () => 
const params = lat: this.state.lat, lng: this.state.lng;

Promise.props(
  local: axios(
    url: 'https://api.yelp.com/v3/businesses/search',
    params: params,
    json: true,
    method: 'GET',
    headers: 'user-key': 'MY-API-KEY'
  ).then(res => console.log(res.data))
    .catch(err => console.log(err))
 )
  .then(data => 
    this.setState(
      yelpData: data
    );
  );
 

但我收到以下错误:

Failed to load https://api.yelp.com/v3/businesses/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 403.

任何帮助都会很棒! Google 已阻止 zomato api 在我的应用程序上运行,因为它会惩罚任何拥有 symantecs SSL 证书的网站。所以我必须改变这个......

谢谢!

【问题讨论】:

***.com/questions/27365303/… github.com/Yelp/yelp-fusion/issues/64 【参考方案1】:

此问题与后端服务器有关,当Axios 发送飞行前请求时,服务器应允许带有标头的请求和响应。

在这种情况下你能做什么?

由于您无权访问服务器,因此您需要使用此 chrome 扩展:Allow-Control-Allow-Origin 或者您可以使用在线 CORS 代理,例如:

https://cors-anywhere.herokuapp.com/http://example.com

http://cors-proxy.htmldriven.com/?url=http://www.htmldriven.com/sample.json

CORS 代理是为需要绕过的开发者提供的免费服务 与执行标准 AJAX 请求相关的同源策略 3rd 派对服务。

在您的代码中应用herokuapp

getYelp = () => 
const params = lat: this.state.lat, lng: this.state.lng;
const urlProxy = 'https://cors-anywhere.herokuapp.com/https://api.yelp.com/v3/businesses/search';
Promise.props(
  local: axios(
    url: urlProxy,
    params: params,
    json: true,
    method: 'GET',
    withCredentials: true,
    headers: 
                'user-key': 'MY-API-KEY'
                'Accept': 'application/json',
                'Content-Type': 'application/json'
                'Origin': 'http://localhost:8000',
                'Access-Control-Allow-Headers': '*',
                'Access-Control-Allow-Origin': 'http://localhost:8000',
            ,
  ).then(res => console.log(res.data))
    .catch(err => console.log(err))
 )
  .then(data => 
    this.setState(
      yelpData: data
    );
  );
 

我添加了withCredentials,它使您的浏览器在您的 XHR 请求中包含 cookie 和身份验证标头。如果您的服务依赖于任何 cookie(包括会话 cookie),则它仅适用于此选项集。

【讨论】:

嗨,利亚姆!非常感谢您的解释!这真的很有帮助,我不知道 URL/api 的存在!真的很有帮助的解释,真的很感激。我确实阅读了有关 chrome 扩展程序的信息,但我假设任何其他想要使用我的应用程序的人也需要安装它?我试过你的代码 - 谢谢你写这个!!!但是,我在控制台中得到了以下内容...... app.js:9097 Refused to set unsafe header "Origin" hub:1 Failed to load cors-anywhere.herokuapp.com/https://api.yelp.com/v3/businesses/…: response to preflight request does not pass access控制检查:当请求的凭据模式为“包含”时,响应中的“Access-Control-Allow-Origin”标头的值不能是通配符“*”。因此,Origin 'localhost:8000' 不允许访问。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。 嗯,这是安全的一部分,不过你需要避免使用withCredential

以上是关于Yelp Api - Axios/ReactJs - 如何编写代码的主要内容,如果未能解决你的问题,请参考以下文章

需要一个类似于 Yelp 和 Google Places 的良好商业搜索 API

Ionic 2 Yelp API

Django 预加载 Yelp API 结果

如何在邮递员上提出Yelp API GET请求?

Alamofire 获取请求和 JSON 响应(Yelp API)

PHP 从YELP API解析JSON