Почему .post JQuery не возвращает данные? - PullRequest
2 голосов
/ 02 сентября 2010

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

<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';

Ответы [ 5 ]

4 голосов
/ 02 сентября 2010

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

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

0 голосов
/ 02 сентября 2010

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

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

0 голосов
/ 02 сентября 2010

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

Удачи.

0 голосов
/ 02 сентября 2010

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

0 голосов
/ 02 сентября 2010

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

...