我将JSON请求发布到远程服务。一切都很好,服务很好,它回应我。但我没有从远程服务返回的数据。如何通过.post从JQuery获取远程json服务的数据?为什么这个例子返回数据 - “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';
答案 0 :(得分:4)
你遇到了same-origin policy,它阻止(除其他外)XmlHttpRequest从远程域获取数据。您的POST 将成功,但浏览器不允许您收到回复。
由于你要去一个远程域名,你的最佳镜头是support JSONP,它的工作方式不同,你不能发布,所以它会得到一个GET,但它会让你获取数据。 JSONP使用完全获取数据的不同方法,基本上将回调定义为名称函数,然后在页面中创建<script>
标记。远程服务器以namedFunction({ ...JSON data })
响应,您的页面运行...而不需要XmlHttpRequest。
答案 1 :(得分:0)
jquery使用帖子返回的数据来确定请求是否成功。如果情况并非如此,则会引发异常。
答案 2 :(得分:0)
您的客户端代码jsFiddle似乎没有任何问题,但是,您可能希望将"{\"ipaddr\":\"192.168.132.58\"}"
更改为{ipaddr:"192.168.132.58"}
,因为这与发送表单相同使用名为ipaddr
且值为192.168.132.58
的字段,您自己的选项是发送一个名为{"ipaddr":"192.168.132.58"}
的字段,其值为空。
答案 3 :(得分:0)
尝试并检查服务器端输出是否有随机空白,具体取决于可能会破坏解析的浏览器。
答案 4 :(得分:0)
“就他们的意图而言 - 唯一真正的技术差异(如果我错了请更正这篇文章)是GET对查询字符串的限制要短得多。实际上,GET意味着从服务器获取内容时.GET调用不应该对服务器造成副作用.POST是指你打算在服务器上发送内容并让它对它做一些事情。“ (Difference between jquery.post and jquery.get?)
你试过$ .get()吗?它应该更快,更习惯于从服务器返回数据......以下是一些文档:http://api.jquery.com/jQuery.get/