2010-09-02 2 views
2

Я отправляю запрос JSON на удаленный сервис. Все в порядке, сервис отлично работает, и это ответ на меня. Но у меня нет данных, возвращаемых с удаленного сервиса. Как получить данные из удаленного json-сервиса JQuery через .post? Почему этот пример возвращает данные - `` нуль ':Почему JQuery's .post не возвращает данные?

<SCRIPT> 
$(function() { 
    $('#zzz').click(function() { 
     $('#lak').html('wait...'); 
     $.post(
    'http://127.0.0.1:3000/test', 
    "{\"ipaddr\":\"192.168.132.58\"}", 
    function(data) { alert(data); }, 
    "json" 
     ) 
    }); 
}); 
</SCRIPT> 

Но TCP сниффер показывает мне, что служба возвращает некоторые данные:

HTTP/1.1 200 OK 
Connection: Keep-Alive 
Content-Type: application/json 
X-Powered-By: Mojolicious (Perl) 
Date: Thu, 02 Sep 2010 06:17:10 GMT 
Content-Length: 37 
Server: Mojolicious (Perl) 

{"status":"OK","result":"successful"} 

Решено:

<SCRIPT> 
$(function() { 
    $('#clickme').click(function() { 
$.getJSON('http://domain.tld/test/?foo=bar&callback=?', 
function(jsonp) { 
    $('#jsonp-example').html(jsonp.result); 
}); 
    }); 
}); 
</SCRIPT> 

<div id="jsonp-example"><a id="clickme" href="javascript:void()">Click me</a></div> 

И пример службы Mojolicious JSONP:

# /test/?foo=bar&callback=smth 
get '/test' => sub { 
my $self = shift; 

my $foo = $self->param('foo') || ''; 
my $callback = $self->param('callback') || 'jsonp'; 
... 
my $json = $self->render(
    json => { 
    'status' => 'OK', 
    'result' => 'successful' 
    }, 
    partial => 1); 

$self->render(data => "$callback($json)", format => 'js'); 
} => 'test'; 

ответ

4

Вы работаете в same-origin policy, который предотвращает (помимо прочего) XmlHttpRequest получение данных из удаленного домена. Ваш POST будет успешным, но браузер не позволит вам получить ответ.

Поскольку вы отправляетесь в удаленный домен, ваш лучший снимок - support JSONP, он работает по-другому, вы не можете POST, чтобы он получил GET, но он позволит вам получить данные обратно , JSONP использует полностью другой способ получения данных, в основном определяя ваш обратный вызов как функцию имени, а затем создавая тег <script> на странице. Удаленный сервер отвечает namedFunction({ ...JSON data }), на котором работает ваша страница ... без необходимости использования XmlHttpRequest.

+0

+1 для упоминания SOP. –

0

Возвращенные данные из сообщения используются jquery, чтобы определить, был ли запрос успешным или нет. Если это не так, будет возбуждено исключение.

0

Кажется, не будет ничего плохого клиентского кода на стороне jsFiddle, однако, вы, вероятно, хотите изменить "{\"ipaddr\":\"192.168.132.58\"}" к {ipaddr:"192.168.132.58"}, поскольку это было бы то же самое, отправив форму с полем имени ipaddr со значением 192.168.132.58, ваш собственный вариант отправил поле с именем {"ipaddr":"192.168.132.58"} с пустым значением.

Удачи.

+0

Мне нужно отправить запрос json. Если я, как вы написали у меня будет пост запрос, как это: IPADDR = 192.168.132.58 Вместо формата JSON (что мне действительно нужно): { «IPADDR»: «192.168.132.58»} – dynax60

0

Попробуйте проверить выход вашей серверной части для случайных пробелов, в зависимости от браузера, который может испортить разбор.

0

«Насколько они предназначены для - единственное реальное техническое различие (пожалуйста, исправьте этот пост, если я ошибаюсь) в том, что GET имеет гораздо более короткий предел для строки запроса. На практике GET означает когда вы получаете что-то с сервера. Вызов GET не должен вызывать побочные эффекты на сервере. POST - это когда вы собираетесь отправить что-то на сервер и заставить его что-то делать с ним ». (Difference between jquery.post and jquery.get?)

У вас пробовал $ .get()? Он должен быть быстрее и больше используется для возврата данных с сервера ... Вот некоторая документация: http://api.jquery.com/jQuery.get/

+0

Получить не работая с json-форматом, т.е. я не могу опубликовать его в json-форме. – dynax60

Смежные вопросы