Тестирование статического ответа jsonp - PullRequest
5 голосов
/ 07 декабря 2010

У меня нет проблем с выполнением запросов jsonp, однако я не уверен в настройке веб-службы для доставки ответов в jsonp.

Во-первых, нужно ли настраивать сервер определенным образом, чтобы разрешать запросы jsonp, или странице просто нужно правильно отформатировать ответ?

В моем тестировании у меня был следующий ответ jsonp от geonames.org (я поместил его на пустую страницу на сервере / домене 1 и ничего больше):

<?php echo $_GET['callback'];?>({"postalcodes":[{"adminName2":"Westchester","adminCode2":"119","postalcode":"10504","adminCode1":"NY","countryCode":"US","lng":-73.700942,"placeName":"Armonk","lat":41.136002,"adminName1":"New York"}]});

На сервере / домене 2 я делаю следующий запрос:

$.ajax({
    // works when I make the call to geonames.org instead of domain1
    //url: 'http://www.geonames.org/postalCodeLookupJSON?postalcode=10504&country=US&callback=?',,
    url: 'http://www.domain1.com/test/jsonp.php?callback=?',
    success: function(data) {
        $('#test').html(data);
    },
});

Вызов работает, когда я размещаю файлы на одном сервере (в домене 1 или 2) и превращаю его в обычный запрос json. Что я делаю не так?

Просто чтобы уточнить: Мой вопрос относится к странице ПОЛУЧЕНИЕ запроса. Я знаю, что запрос работает, когда я делаю это на geonames.org, flickr и т. Д. Apis. Тем не менее, я пытаюсь настроить страницу для отправки ответа. В моем примере у меня просто пустая страница с жестко закодированным jsonp. Я не уверен, что мне нужны другие заголовки на странице или что-то на моем сервере включено.

Ответы [ 2 ]

12 голосов
/ 07 декабря 2010

Ответ неправильный.

Если у вас есть следующий URL: http://www.mydomain.com/test/jsonp.php&callback=? jQuery заменит знак вопроса в конце URL уникальной строкой.На стороне сервера вы должны взять эту строку ( $ _ GET ['callback'] ) и использовать ее в качестве имени функции в своем ответе:

PHP-пример:

<?php
 $object=array('postalcodes'
                  =>array(
                            array(
                                    "adminName2"  =>  "Westchester",
                                    "adminCode2"  =>  "119",
                                    "postalcode"  =>  "10504",
                                    "adminCode1"  =>  "NY",
                                    "countryCode" =>  "US",
                                    "lng"         =>  -73.700942,
                                    "placeName"   =>  "Armonk",
                                    "lat"         =>  41.136002,
                                    "adminName1"  =>  "New York"
                                   )));

   echo $_GET['callback'].'('.json_encode($object).')';
?>

Что происходит с ответом при его получении?jQuery знает уникальную строку (при условии fx123456 ).
jQuery создаст <script> -элемент с src: http://www.mydomain.com/test/jsonp.php&callback=fx123456.jQuery вызовет на лету созданную функцию с именем fx123456 () .Эта функция вернет JSON (как объект), который будет принят в качестве аргумента данных функции успеха $. Ajax () .

Так что если вы не используетепараметр обратного вызова, предоставляемый jQuery в качестве имени функции внутри ответа, jQuery не знает имени вызываемой функции (лучше сказать, jQuery будет вызывать функцию, которая не существует).

0 голосов
/ 07 декабря 2010

Я всегда использовал $. GetJSON () вместо $ .ajax для кросс-браузерных запросов, поэтому я не знаю особенностей вызова json с использованием $ .ajax, как здесь, но Вы пытались установить для dataType значение jsonp?

Кроме того, вы пробовали? Callback =? вместо & callback =?

$.ajax({
    url: 'http://www.mydomain.com/test/jsonp.php?callback=?',
    dataType: 'jsonp',
    success: function(data) {
        $('#test').html(data);
    },
});

Наконец, когда я запускаю ваш тестовый json в jsonlint.com , он не вернется действительным. Это говорит syntax error, unexpected TINVALID at line 1 Parsing failed

...