Как настроить JSONP?
Что мне нужно на стороне сервера, чтобы кто-то мог получать данные с этого сервера с помощью JSONP. И что мне нужно делать на стороне пользователя? Я хочу использовать JSONP в качестве альтернативы XMLHttpRequest.
Он не будет работать из моего расширения Firefox из-за политики того же самого происхождения. Таким образом, люди рекомендовали JSON, но я очень потерялся после поиска учебников и руководств в Интернете.
Спасибо за помощь!
Ответы
Ответ 1
Предполагая, что ваш сервер работает с PHP, вам просто нужно добавить запрос "обратного вызова" GET.
<?php header('content-type: application/json; charset=utf-8');
$data = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);
echo $_GET['callback'] . '('.json_encode($data).')';
И на стороне клиента (используя jQuery):
$.ajax({url: 'http://site.com/data.php', dataType:'jsonp'});
PHP-код, приведенный выше, предназначен только для демонстрации, не забывайте санировать $_GET ['callback']
Тем не менее, если ваша проблема совпадает с той же политикой происхождения, вам, возможно, просто нужно разрешить перекрестное происхождение со стороны сервера, и все должно работать.
Ответ 2
На стороне сервера все, что вам нужно настроить, - это веб-ресурс (например, страница), который принимает запрос GET
и возвращает данные, используя соглашение JSON-P, которое:
callback({"data": "here"});
... где имя функции ( "обратный вызов" в этом примере) обычно берется из одного из параметров строки запроса (по соглашению, параметр "обратный вызов" ), а данные JSON (хотя технически это может быть что-либо, что действительно в объекте JavaScript-объекта, соглашение с JSON-P заключается в том, чтобы ограничить себя действительностью в JSON). Так, например, скажем, что запрос выглядел так:
http://example.com/foo.php?callback=bar
Это вызывает страницу foo.php
(необязательно быть PHP, может быть любой динамической серверной системой), говоря ей, что функция, которую мы хотим вызвать, - "bar". Наш ответ:
bar({"data": "here"});
На стороне клиента вам необходимо добавить элемент script
на страницу динамически, а также добавить функцию обратного вызова, которая будет вызвана ответом JSON-P. Обычно вы хотите присвоить этой функции какое-то случайное имя и удалить ее, когда закончите.
Вот полный пример в качестве ответа на другой вопрос здесь о переполнении стека. Возможно, вам придется немного приспособить его для использования в надстройке Firefox, но концепции одинаковы.
Ответ 3
jsonp - это json с оберткой, поэтому вы можете подделывать ajax-запросы другому серверу, динамически вставляя новые теги <script>
, при этом src указывает на другой сервер. Обертка по существу делает возвращаемый материал jsonp действительным вызовом функции javascript, который может быть выполнен для извлечения стандартных json-данных внутри.
Как правило, в небезопасной версии "только для демонстрации" у вас есть что-то вроде этого:
function unwrap_jsonp(data) {
eval(data);
}
Удаленный сервер вернет следующий литерал:
unwrap_json("{'this':'is','sparta':'!'}");
Обратите внимание, что это буквальный JScript-код открытого текста, который выполняется и "разворачивает" встроенную строку JSON обратно в собственную структуру данных javascript.
Большинство служб JSONP позволяют указать дополнительный параметр через строку запроса, чтобы назвать функцию обработчика, в которую вы хотите включить ответ, например.
http://example.com/getjsonp.php?callback=unwrap_json