2010-12-07 1 views
5

У меня нет проблем с созданием запросов jsonp, однако я не уверен в настройке веб-службы для доставки ответов в 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 I» м делает следующий запрос:

$.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. Я не уверен, что мне нужно иметь некоторые другие заголовки на странице или что-то включено на моем сервере.

+0

является вызывающим и существует сервер в том же домене ??? – kobe 2010-12-07 04:36:10

+0

@gov, нет, они этого не делают. В моем примере используются три разных сервера (и домены). Домен 1 запрашивает данные из geonames.org. Принимая ответ от geonames.org и помещая его на пустую страницу в домене 2, и выполнение того же запроса из домена 1 в домен 2 не работает. То же самое для того, чтобы обратить вспять его и сделать запрос от домена 2 до домена 1. – Choy 2010-12-07 04:46:22

+0

Пришлось добавить заголовок управления доступом, чтобы заставить его работать: header ('Access-Control-Allow-Origin: *'); (в PHP) – Choy 2010-12-07 16:14:10

ответ

12

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

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

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

Я всегда использовал $.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