Как настроить 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