#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