не могу добавить функцию обратного вызова в jquery getJSON - PullRequest
2 голосов
/ 26 октября 2011

Я пытаюсь сделать кросс-доменный запрос в jquery, в функции, подобной той, что была найдена в this gist

Я думал, что у меня неверный JSON, но это то, что я получаюиз ответа:

{"status":"OK","errorMessage":"","numberOfResults":10,"suggestions":[{"url":"http://dbpedia.org/resource/Bassiana","label":"Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Julia_Soaemias_Bassiana","label":"Julia Soaemias Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Julia_Bassiana","label":"Julia Bassiana","owner":0},{"url":"http://dbpedia.org/resource/Varius_Avitus_Bassianus_Marcus_Aurelius_Antoninus","label":"Varius Avitus Bassianus Marcus Aurelius Antoninus","owner":0},{"url":"http://dbpedia.org/resource/Bassianus_%28senator%29","label":"Bassianus (senator)","owner":0},{"url":"http://dbpedia.org/resource/Johannes_Bassianus","label":"Johannes Bassianus","owner":0},{"url":"http://dbpedia.org/resource/Julius_Bassianus","label":"Julius Bassianus","owner":0},{"url":"http://dbpedia.org/resource/Bassian_thrush","label":"Bassian thrush","owner":0},{"url":"http://dbpedia.org/resource/Bassianae","label":"Bassianae","owner":0},{"url":"http://dbpedia.org/resource/Bassian","label":"Bassian","owner":0}]}

Как я должен заставить это работать?Кажется, что обратный вызов никогда не запускается, поскольку JSON недопустим.

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

Проблема не в том, что он недействителен (как при передаче его, хотя этот сайт подтвердит), а в том, что он никогда не "оборачивается" в методе обратного вызова.

Поиск JSONp .

Если бы вы позвонили /getMyJSON?callback=myCallback ваш ответ JSONP должен вернуться как:

myCallback({"status":"OK","errorMessage":"","numberOfResults" ...);

(Обратите внимание, что теперь он обернут ввызов функции, который вы должны были определить на своей странице и быть готовым к обработке возвращенных результатов).

1 голос
/ 26 октября 2011

Для междоменного запроса необходимо использовать JSONP. Запросы JSONP на самом деле отправляются в виде запроса сценария и требуют, чтобы вы предоставили обратный вызов (и параметр обратного вызова), чтобы сервер мог доставить сценарий, который содержит вызов вашей функции обратного вызова в качестве его содержимого. Способ сделать это с помощью вызова getJSON - добавить &callback=? к другим параметрам URL. Это отмечает jQuery, что он должен сделать запрос JSONP, а также указывает ему создать анонимную функцию, которая вызывает ваш обратный вызов.

ПРИМЕЧАНИЕ: сервер должен поддерживать JSONP, так как он должен по-разному обрабатывать ответ, то есть возвращаемый в виде сценария с данными, предоставленными в качестве параметра для обратного вызова. Сервисы, которые поддерживают прямой доступ через Javascript, должны поддерживать JSONP. Если служба не поддерживает JSONP, вам необходимо прокси-запрос на вашем сервере, где вы можете запросить его как обычный JSON, поскольку у вас нет ограничений междоменного браузера.

$.getJSON('http://some.other.dom/controller/action?x=y&callback=?`, function(data) {
    // here the data is the deserialized JSON as an object
});
0 голосов
/ 26 октября 2011

Это не JSONP - JSONP включает в себя обратный вызов. Суть, на которую вы смотрели, ничего не говорит о том, чтобы быть междоменной. Вам нужно будет посмотреть на сервис и посмотреть, что нужно сделать, чтобы он вернул jsonp, а не json.

Вот пример звонка, возвращающего мой последний твиттер:

http://twitter.com/status/user_timeline/rossdargan.json?count=1&callback=JSONPcallbackFunction

Как видите, результат помещается в JSONPcallbackFunction:

JSONPcallbackFunction([{"place":{"bounding_box":{"type":"Polygon","coordinates...
...