API-интерфейс Nominatim от OpenStreetMap теперь поддерживает JSONP, поэтому вы можете получать данные исключительно с помощью кода на стороне клиента, не требуя ничего лишнего на вашем собственном сервере. Вот jsfiddle пример - если вы можете сделать это в jsfiddle, вы можете сделать это где угодно.
Что касается более общего вопроса о том, как получить доступ к API из других доменов, вот несколько полезных вещей, которые я узнал, пробираясь через множество частично полных и часто противоречивых ответов, а также методом проб и ошибок. Пожалуйста, измените или прокомментируйте, если что-то является или становится неточным.
- Если вы не можете использовать API, поддерживающий JSONP, вам нужно посмотреть на плагины, такие как jquery-xdomain-ajax , используя такие вещи, как YQL и понять, как они работают. Как правило, эти плагины предназначены для чтения HTML больше, чем для запросов к API.
- Чтобы получить прямой доступ к API, он должен: а) предложить результаты в JSON и б) иметь встроенную поддержку JSONP, что означает:
- API должен быть настроен на прослушивание параметра, который сообщает ему имя функции для переноса результата в
- Вы должны выяснить, как называется этот параметр. В случае OSM он называется
json_callback
, jQuery по умолчанию callback
будет работать только в том случае, если случайно это то, что API запрограммирован на прослушивание
- В jQuery именно этот параметр-специфичный для API ключ параметра должен идти в конце URL вашего запроса с
?
(например, если это json_callback
, тогда someurl.com/api?json_callback=?
). jQuery выясняет, что это такое, заменяет ?
на строку, подобную jQuery1712164863864387412
, именует встроенную функцию с той же строкой и ожидает получения некоторого кода, который запускает эту функцию по имени и передает ей JSON.
- Если запрос работает, но обратный вызов не запускается, и вы видите ошибку, подобную
parseerror jQuery17109935275333671539_1300495251986 was not called
, это означает, что в jQuery есть функция с именем, готовая и ожидающая, но API не использовал эту строку для переноса JSON, поэтому функция не вызывается - вероятно, это означает, что вы не используете правильное имя параметра
- Без jQuery вам нужно передать ключу параметра имя именованной функции, которая получит JSON
- Поскольку в сущности все, что происходит, это то, что браузер загружается, то контролируемым образом выполняется фрагмент кода javascript, эквивалентный
someFunction({"some": "argument"});
, обработка ошибок ограничена (но посмотрите, что jQuery предлагает для jQuery, если вы используете полный $.ajax
синтаксис вместо урезанного $.getJSON
ярлык)
- В Firebug для меня, по крайней мере, запросы JSONP не отображаются в консоли, как другие AJAX-вызовы, скорее, они находятся внизу панели NET (поскольку под капотом это, по сути, обходные пути). способ загрузки кода, обработанный больше как скажем
<script>
).
Надеюсь, это кому-нибудь поможет!