API 使用 HTTP 授权请求 Header 在 componentDidMount 内部

API Request with HTTP Authorization Header inside of componentDidMount

我是 React 的新手,为了练习,我正在尝试构建一个从 Yelp API 获取信息的应用程序,但我无法获得响应。 Yelp Fusion v3 需要 'access_token'(我已在 Postman 中成功收到回复)。因此,为了在我的应用程序中提出这个请求,我使用了 Axios。当我在 componentDidMount() 中发出此请求时,作为响应,我得到

XMLHttpRequest cannot load https://api.yelp.com/v3/businesses/search?term=sushi&location=Boston. 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:8080' is therefore not allowed access. The response had HTTP status code 500.

虽然我似乎错误地指定了 access_token 和参数,但是当 运行 相同的代码在单独的文件(不是应用程序的一部分)中时,我得到 JSON 我在我的应用程序中寻找的响应。

这是我的 componentDidMount():

componentDidMount: function () {
    axios.get('https://api.yelp.com/v3/businesses/search?term=Sushi&location=Boston',{
        headers: {
            Authorization: `Bearer ${token}`
        }
    })
    .then(function(res){
        console.log(res)
    })
    .catch(function(err){
        console.log(err)
    })
},

我也试过 Yelp 节点模块,但我没有运气。请帮忙!

此错误是跨源错误。

Web 浏览器在 AJAX 请求中有一个问题:它们需要寻址到同一来源或由第三方本身授权,否则它们将被阻止。由于您无法控制 Yelp,我建议您采取解决方法。

可用的解决方法

  • 你使用类似 jsonp 的东西。此方法基本上包括在 <script> 标记中发出请求。服务器会将响应包装在 Javascript 脚本中,并将其加载到页面中。 (https://en.wikipedia.org/wiki/JSONP)。服务器必须提供此格式才能使该解决方法起作用。
  • 您使用了反向代理。您可以将 NodeJS 设置为一个。在此设置中,您将向您的来源发出 yelp 请求,来源会将其重定向到 yelp 服务器。这是可行的,因为您的 Node 代理没有与您的浏览器相同的限制。 (例如:https://github.com/nodejitsu/node-http-proxy

可能还有其他方法可以解决这个问题,但这些都是流行的方法。

希望对您有所帮助。