更新IV /当前状态:我现在已经确认了另一个问题,即文件的字符编码很好,而不是问题的原因。我还测试了另一台服务器,错误仍然存在。然而它确实对localhost有效。 总结一下: JSONP调用适用于localhost,但是当针对外部域运行时,来自服务器的响应为空(没有标头/没有http响应代码)。复制请求的URL并将其直接插入浏览器时,输出正确,格式正确(utf-8 / json)。
小提琴: http://jsfiddle.net/5SJvp/1/
更新III:我现在能够在localhost上成功运行。但是,对我的生产域使用完全相同的代码(客户端和服务器)仍然会失败。来自服务器的响应是“空的”意味着它不返回http状态代码。
更新II:经过一些调试后,我注意到响应中没有包含http状态代码。这可能是我的问题的原因?我认为这意味着服务器端存在问题,但我不能为我的生活看到哪里。
更新我:从jQuery剪切请求似乎停止。
// Do send the request
// This may raise an exception which is actually
// handled in jQuery.ajax (so no try/catch here)
xhr.send( ( s.hasContent && s.data ) || null );
Params(来自Firebug)
_ 1356655864905
callback jQuery18308375673194150332_1356655863817
p 0522
pl 12
s false
secret ##############################
u request12341299
请求(来自Firebug)
Accept text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language nb-no,nb;q=0.9,no-no;q=0.8,no;q=0.6,nn-no;q=0.5,nn;q=0.4,en-us;q=0.3,en;q=0.1
Connection keep-alive
Host localhost:8888
Referer http://localhost:8888/popup.html
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/20100101 Firefox/17.0
X-Requested-With XMLHttpRequest
原始问题:
我正在努力解决看似常见的问题,但我还没有找到解决方案。我正在尝试使用jQuery执行一个非常简单的jsonp调用。问题是a)没有发生任何事情或b),服务器的响应是空的。
我尝试了几种不同的方法,使用$ .ajax方法和$ .getJSON方法。两者都产生相同的错误结果。使用下面的代码没有任何反应:使用Chrome调试器我可以看到它只是通过该方法停止执行。然而,使用Wireshark我可以看到客户端执行三次握手并因此预先发送数据,它就是不能这样做。
如果我删除 callback =?它会执行,但是响应格式不正确(或者至少,我认为是这样,因为我只能在Firebug中看到标有红线的响应)。
$.ajax({
url: "http://mydomain.com/asd.php", //"http://localhost:8888/index.php",
dataType: 'jsonp',
type: 'GET',
data: {p:p, u:u, s:symbols, pl:pl, secret:secret},
contentType: "application/json; charset=utf-8",
async: false,
success: function(data){
console.log("What " + data.test);
},
error: function(data){
console.log("failed for some reason");
}
});
服务器代码($ callback = $ _GET [“callback”]
<?php header('content-type: application/json; charset=utf-8');
.
.
.
$data = array
(
"message" => $message,
"status" => $statuscode,
"length" => strlen($message)
);
echo $callback . '('.json_encode($data) .')';
exit;
?>
以下是具有手动输入的服务器响应。
funcName({"message":"!0b7(cb6Gv40","status":"OK","length":12})
答案 0 :(得分:1)
如果没有jsfiddle / jsbin很难调试,所以我最好的建议是尝试使用假的静态数据(只是一个空的JSON结构,{})来处理请求。
似乎问题可能在于你如何使用json_encode,因为你在添加callback =时写了这个? param的反应看起来很糟糕。建议的测试可以让您更好地诊断问题所在。
答案 1 :(得分:0)
callback
是jsonp的包装函数名称的通用GET参数。当您在jQuery请求中使用callback=?
时,jQuery会将?
解析为带有时间戳的其他内容,因此它将始终是唯一值。 API服务器将json包装在这个唯一的函数名中,jQuery存储该名称,以便它可以使用它来解包响应。
某些API不灵活且需要自己的特定名称,在这种情况下,您可以使用jsonpCallback
中的$.ajax
选项或在$.ajaxSetup
请参阅$.ajax
API文档:http://api.jquery.com/jQuery.ajax/
答案 2 :(得分:0)
从您的代码开始,我已在本地设置它,一切都按预期工作:
test.php:
<?php
$callback = $_GET["callback"];
$data = array
(
"message" => 'test',
"status" => 200,
"length" => strlen('test')
);
echo $callback . '('.json_encode($data) .')';
exit;
test.html :
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(document).ready(function(){
$.getJSON("http://localhost/test.php?callback=?",
{
whatever: 1,},
function(data) {
alert("hmm");
});
});
</script>
</head>
<body>
</body>
</html>
有两件事可以帮到你:
callback=?
失败,因为从服务器返回的JSON无效JSON(由于json数据周围的括号)。在这种情况下,$.getJSON
将无声地失败。如果您想查看错误,请改用$.ajax
。希望有所帮助
答案 3 :(得分:0)
嗯,您可以尝试使用'Fiddler'来调试呼叫吗?也许那个空的服务器响应毕竟不是那么空。 或者您的服务器可能有一些奇怪的安全设置,并检查REFERRER标头以阻止外部呼叫?
如果您可以为您的应用提供完整的网址,我可以为您测试=)
答案 4 :(得分:0)
如果您没有正确设置SSL证书,这显然会 NOT 工作。
当我将https转换为http:http://jsfiddle.net/eysEe/
时,此功能正常var u = "test";
var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";
$.ajax({
url: "http://serve.pin2pass.com?index.php",
dataType: 'jsonp',
type: 'GET',
data: {
p: p,
u: u,
s: symbols,
pl: pl,
secret: secret
},
contentType: "application/json; charset=utf-8",
async: false,
success: function(data) {
$('#test').text(data.message);
},
error: function(data) {
$('#test').text("SDf");
}
});
当“https://serve.pin2pass.com?index.php”导致风险较高的页面时,您可以判断是否安装了错误的SSL。也许你从来没打算把它放在https模式下?
答案 5 :(得分:0)
所以,随着新的小提琴,它更容易工作。这是您通话的工作样本 -
var u = "test";
var p = 1234;
var symbols = false;
var pl = 16;
var secret = "c68f39913f901f3ddf44c707357a7d70";
$.ajax({
url: "https://serve.pin2pass.com/index.php",
dataType: 'jsonp',
type: 'GET',
data: {
p: p,
u: u,
s: symbols,
pl: pl,
secret: secret
},
contentType: "application/json; charset=utf-8",
aync:true,
success: function(data) {
$('#test').text(data.message);
},
error: function(data) {
console.log("failed for some reason");
}
});
我希望我在这里不会遗漏一些东西。我必须做的唯一改变是在请求网址中,来自
https://serve.pin2pass.com?index.php
要 https://serve.pin2pass.com/index.php
希望这能解决它。