1

更新 IV / 当前状态:我现在通过另一个问题确认文件的字符编码很好,而不是问题的原因。我还针对另一台服务器进行了测试,但错误仍然存​​在。但是,它确实适用于本地主机。 总结一下: JSONP 调用适用于 localhost,但是当针对外部域运行时,来自服务器的响应是空的(没有标头/没有 http 响应代码)。复制请求的 URL 并将其直接插入浏览器时,输出正确且格式正确(utf-8 / json)。

小提琴:http: //jsfiddle.net/5SJvp/1/

更新三:我现在可以让它在 localhost 上成功运行。但是,对我的生产域使用完全相同的代码(客户端和服务器)仍然失败。服务器的响应是“空的”,意思是说它没有返回 http 状态码。

更新二:经过更多调试后,我注意到响应不包含 http 状态代码。这可能是我的问题的原因?我认为这意味着服务器端出了点问题,但我一辈子都看不到在哪里。

更新 I:从 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 ); 

参数(来自 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 我可以看到客户端执行了三向握手,因此准备发送数据,但它没有做到这一点。

如果我删除回调=?它确实执行了,但是响应格式错误(或者至少,我认为是这样,因为我只能在 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})
4

6 回答 6

1

没有 jsfiddle/jsbin 很难调试它,所以我最好的建议是尝试让请求使用假的静态数据(只需一个空的 JSON 结构,{},就可以了)。

似乎问题可能在于您如何使用 json_encode,因为您在添加 callback=? 时编写了该代码。参数响应看起来很混乱。建议的测试可以让您更好地诊断问题所在。

于 2012-12-26T08:18:50.363 回答
0

嗯,你可以尝试使用'Fiddler'来调试调用吗?也许那个空的服务器响应毕竟不是那么空的。或者您的服务器可能有一些奇怪的安全设置,并检查 REFERRER 标头以阻止外部调用?

如果您可以为您的应用提供完整的 url,我可以为您测试它 =)

于 2012-12-31T11:19:12.457 回答
0

从您的代码开始,我在本地进行了设置,一切都按预期工作:

测试.php:

<?php

$callback = $_GET["callback"];

$data = array
(
    "message" => 'test',
    "status" => 200,
    "length" => strlen('test')        
);

echo $callback . '('.json_encode($data) .')';
exit;

测试.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>

有两件事可以帮助你:

  1. callback=?由于从服务器返回的 JSON 不是有效的 JSON(由于您的 json 数据周围有括号),因此未将其放入您的调用中会失败。$.getJSON在这种情况下会默默地失败。如果您想查看错误,请$.ajax改用。
  2. 您的问题可能来自您显然在这里尝试使用 https 的事实。至少在 Chrome 中,向带有无效证书的 https URL 发出 AJAX 请求(我假设您的本地主机或测试域没有有效证书)只会在控制台中出现错误。浏览器从不提示“您确定吗?” 关于证书。

希望能帮助到你

于 2012-12-26T17:18:05.437 回答
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");
    }
});​

jsfiddle

我希望我不会在这里错过任何东西。我必须做的唯一更改是在请求 url 中,从

https://serve.pin2pass.com?index.php

https://serve.pin2pass.com/index.php

希望这能解决它。

于 2013-01-01T07:46:45.450 回答
0

如果您没有正确设置 SSL 证书,这显然不起作用。

当我将 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 模式?

于 2013-01-01T04:34:46.843 回答
0

callback是 jsonp 的包装函数名称的通用 GET 参数。当您callback=?在 jQuery 请求中使用时,jQuery 会将其解析?为带有时间戳的其他内容,因此它始终是唯一值。API 服务器会将 json 包装在这个唯一的函数名中,jQuery 存储该名称以便它可以使用它来解包响应。

一些 API 不灵活,需要它们自己的特定名称,在这种情况下,您可以在其中一个中使用该jsonpCallback选项,也可以在其中$.ajax全局设置它$.ajaxSetup

请参阅$.ajax API 文档:http ://api.jquery.com/jQuery.ajax/

于 2012-12-23T00:30:51.027 回答