How to use CORS to implement JavaScript Google Places API request

前端 未结 2 2105
旧巷少年郎
旧巷少年郎 2020-11-28 14:52

I really do NOT understand how I\'m supposed to make this work:

var requestURL = \'https://maps.googleapis.com/maps/api/place/details/json?placeid=ChIJN1t_tD         


        
相关标签:
2条回答
  • 2020-11-28 15:31

    @rd3n already answered about why to use Google Maps' SDK, but if you really need to use the API instead of SDK on a web app (reuse code, for exemple), you can bypass CORS using proxy parameter from Webpack's DevServer.

    const GMAPS_PLACES_AUTOCOMPLETE_URL = (
      process.env.NODE_ENV === 'production'
        ? 'https://maps.googleapis.com/maps/api/place/autocomplete/json'
        : 'place-api' // on development, we'll use the Webpack's dev server to redirect the request
    
    const urlParams = new URLSearchParams([
      ...
    ])
    
    const response = await fetch(
      `${GMAPS_PLACES_AUTOCOMPLETE_URL}?${urlParams}`,
      { method: 'GET' }
    )
    

    And on your webpack.config.js...

    module.exports = {
      devServer: {
        proxy: {
          '/place-api': {
            target: 'https://maps.googleapis.com/maps/api/place/autocomplete/json',
            changeOrigin: true,
            pathRewrite: { '^/place-api': '' }
          }
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-28 15:38

    You are trying to use the Google Places API Web Service on client side whereas it is designed for server side applications. That's probably why appropriate CORS response headers are not set by the server.

    As explained in the Notes at the beginning of the Place Details documentation, you should use the Places Library in the Google Maps JavaScript API:

    If you're building a client-side application, take a look at the Google Places API for Android, the Google Places API for iOS, and the Places Library in the Google Maps JavaScript API.

    Note: you will need to enable the Google Maps JavaScript API in your Google Developer Console first.

    Here is a way you can proceed to get place details (based on the example from the documentation):

    <head>
        <script type="text/javascript">
            function logPlaceDetails() {
              var service = new google.maps.places.PlacesService(document.getElementById('map'));
              service.getDetails({
                placeId: 'ChIJN1t_tDeuEmsRUsoyG83frY4'
              }, function (place, status) {
                console.log('Place details:', place);
              });
            }
        </script>
        <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyAW4CQp3KxwYkrHFZERfcGSl--rFce4tNw&libraries=places&callback=logPlaceDetails"></script>
    </head>
    <body>
        <div id="map"></div>
    </body>
    

    0 讨论(0)
提交回复
热议问题