【问题标题】:Sending a details request to Google Places API - (CORS error)向 Google Places API 发送详细信息请求 -(CORS 错误)
【发布时间】:2016-11-27 07:02:48
【问题描述】:

我正在尝试使用来自 Google Places API 的照片来增加我在这个项目中为公共艺术作品收集的照片。它说here,您可以发送详细信息请求以获取包含十张照片的数组。最终,我将解包响应,为每张照片获取 Google 的 photo reference,并为数组中的每张照片发出请求并显示它。

很遗憾,当我发送详细信息请求时,这个计划就中断了。这是我得到的确切错误:

Fetch API cannot load https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJ5zf5lfXKRIYR8rPafbwaL68&key=MY_API_KEY. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:4040' is therefore not allowed access. 
If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

我从本地主机运行它,我很确定这很重要。我所有的其他 API 调用(Google Maps API 和其他几个)都是按原样编写的,所以我有点困惑为什么我会收到错误。以下是相关代码:

The actual API call:

export function getPhotos(placeID) {
  let obj = {
    method: 'GET'
  };
  return fetch('https://maps.googleapis.com/maps/api/place/details/json?placeid=' + placeID + '&key=MY_API_KEY')
    .then((response) => {
      if (response.status >= 400){
        throw new Error("Error getting photos for placeID: " + placeID)
      }
      return response.json()
    })
}

如果您需要任何其他信息,请告诉我,我很乐意提供。谢谢!

【问题讨论】:

    标签: google-maps-api-3 reactjs cors google-places-api isomorphic-fetch-api


    【解决方案1】:

    您需要使用server side proxy 来防止出现此错误。当您直接访问 url 时它会起作用,因为这样做时您没有来源。

    • 对本地服务器的 JS AJAX 请求 -> 远程服务器,收到请求,发送响应,远程服务器 -> 本地服务器 -> 对 JS 的 AJAX 请求。

    检查这个相关的 SO 问题:

    您可以修改您的 API 服务器以使用 CORS is enabled,或者按照“与现有服务器结合”下的 instructions on the webpack-dev-server 页面将资产服务与 webpack-dev-server 和您自己的 API 服务器结合起来。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      previous answer 建议使用服务器端代理。虽然这对于访问不支持 CORS 或 JSONP 的 Web API 的一般情况来说是一个很好的解决方案,但它并不是解决这个特定问题的最佳解决方案。

      改为使用专为此类用途设计的 Google 的 JavaScript Places Library。该页面顶部的链接提供了其他示例、指南和参考资料。

      【讨论】:

      • 即使在 localhost 上使用 places 库,我仍然会遇到 cors 错误。
      • 这真的很有帮助。我得到了一个方向。我可以创建一个 NodeJS 服务器并请求 Places API 并将来自 nodeJS 的响应发送到我的前端应用程序,或者在我的前端应用程序中使用 Place 库。我仍然没有解决这个问题,而是在解决这个问题。但是在看到这个答案之后,我发现在顶部的 Google Places API 文档中清楚地写道,要开发客户端应用程序,必须使用 JavaScript 地点库而不是地点 API。
      【解决方案3】:

      我提出了一个类似的问题,该问题已结束:-
      React - development server,"cors" issues using https url to retrieve data from api

      我使用本地主机中的 google api 遇到了完全相同的问题。经过一天痛苦的尝试各种事情后,解决方案非常简单。

      我添加了 Allow CORS: Access-Control-Allow-Origin chrome 扩展,将 api 列入白名单并打开了 COR。 这是一个非常古老的问题,当时的解决方案可能不可行,但我希望有一天它对某人有所帮助!

      【讨论】:

      • 我们不能继续添加扩展以在浏览器上运行。最终用户如何知道使您的网页正常工作的扩展程序?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 2012-03-20
      • 2017-12-30
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多