Запрос API Google Places с использованием jQuery

#jquery #google-places-api

#jquery #google-places-api

Вопрос:

API Google Places теперь общедоступен. Я пытаюсь использовать вызов .ajax () в jQuery, чтобы выполнить вызов Google Places. Ошибка, которую я продолжаю возвращать, — это неперехваченная SyntaxError: неожиданный токен:

Я использую jQuery 1.5.2. Я пробовал и 1.5.1, но это дало те же результаты. Я бы предпочел не переходить на 1.6.1, если это в моих силах.

С тех пор я выполнял подобные вызовы ajax для других API, но у меня возникли проблемы с Google Places. Ниже приведен очень простой пример кода, с которым вы можете поиграть. Вам нужно будет получить свой собственный ключ в консоли API, которую предлагает Google (https://code.google.com/apis/console )

 jQuery.noConflict();
 jQuery(document).ready(function(){

  var url = 'https://maps.googleapis.com/maps/api/place/search/json';

  jQuery.ajax({
   url: url,
   dataType: 'jsonp',
   type: 'GET',
   data:  {
     location: '33.787794,-117.853111',
     radius: 1000,
     name: 'coffee',
     key: 'your_key', // add your key here
     sensor: 'false'
     },

   // on success
   success: function(data, textStatus, jqXHR){

      console.log(data);


   },

   // on failure
   error: function (jqXHR, textStatus, errorThrown){
    console.log(jqXHR);
    console.log(textStatus);
    console.log(errorThrown);
   }
   });
 });
  

Ответ №1:

Из того, что я вижу из документации, API веб-службы Google Places не поддерживает JSON только в формате JSONP. Ошибка, которую вы видите, заключается в том, что ответ — это просто JSON, но анализируется так, как если бы это был JSONP, и это вызывает ошибку.

Ознакомьтесь с JavaScript API Google Maps — он включает библиотеку Places, которую вы могли бы использовать — см. google.maps.places.PlacesServices#search() .

AFAIK, похоже, наблюдается сдвиг в сторону удаления поддержки JSONP — например, API геокодирования, который использовался для поддержки JSONP (недокументированный) в версии v2, но больше не в версии v3. Кто-то предположил, что это может быть сделано для того, чтобы побудить разработчиков использовать JavaScript API вместо этого.

Комментарии:

1. Условия предоставления услуг Google Maps API требуют, чтобы API (включая различные веб-сервисы, такие как геокодирование и Places) использовался «совместно с картой Google». Это означает, что при использовании сервисов на веб-странице (где JSONP полезен) вам все равно нужно будет загрузить API для отображения карты, поэтому нет причин не использовать соответствующие классы API для доступа к этим сервисам. Во многих случаях это в любом случае проще, поскольку вам не нужно создавать URL-адреса или кодировать URL-адреса, а результаты преобразуются в соответствующие объекты Maps API (например, google.maps. LatLng) для вас.

2. @Thor, я не думаю, что это больше верно, поскольку они выпустили is публично. В документах теперь указано… «Если ваше приложение отображает данные API Places на странице или представлении, на которых также не отображается Карта Google, вы должны показать логотип «Powered by Google» с этими данными».

3. Учитывая то, что я сказал выше о том, что карта не нужна, как можно вызвать веб-службу из JavaScript, учитывая междоменные проблемы? Только вызовы на стороне сервера?

4. @hemmeter Да, к сожалению (AFAIK) единственными вариантами для междоменных запросов являются JSONP, использование прокси-сервера или доступ к коду сервера для использования заголовков HTTP allow. В этом случае остается только опция прокси.

5. Условия API Google Places гласят: «Вы не должны использовать или отображать содержимое без соответствующей карты Google, за исключением случаев, когда вам явно разрешено делать это в документации Maps APIs или с письменного разрешения Google. Учитывая, что веб-сервисы предназначены для обслуживания мобильных приложений, которые ограничены в пространстве экрана, «соответствующая карта Google» не обязательно всегда отображаться рядом с результатами Places API. Это может быть, например, на другой вкладке, при условии, что логотип «Powered by Google» отображается там, где результаты Places API отображаются без карты.

Ответ №2:

Приведенное ниже не является прямым решением. Но именно так я заставил это работать…

Поскольку JSONP не поддерживается (и я все равно не понял, как клиентский код должен использовать этот API), решение состоит в том, чтобы проксировать его через ваш сервер… Если вы используете rails на стороне сервера, нижеприведенное может сработать для вас:

 class PlacesController < ApplicationController
    def autocomplete
        # Using Google Web Services
        # https://code.google.com/apis/console
        url = "https://maps.googleapis.com/maps/api/place/autocomplete/json"
        _params = {
            :key => "<<< YOUR KEY >>>",
            :types => "geocode",
            :sensor => (params[:sensor] or false),
            :input => params[:q]
        }
        ans = %x{curl -G --data-urlencode #{_params.map{|k,v| "#{k}="#{v}""}.join(" --data-urlencode ")} "#{url}"}
        ans = ActiveSupport::JSON.decode(ans)
        render :json => ans
    end
end
  

PS: Чтобы сгенерировать ключ API, используйте https://code.google.com/apis/console