jQuery JSONP调用PHP后端:没有HTTP响应

时间:2012-12-23 00:09:44

标签: php jquery ajax jsonp

更新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})

6 个答案:

答案 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>

有两件事可以帮到你:

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

答案 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");
    }
});​

jsfiddle

我希望我在这里不会遗漏一些东西。我必须做的唯一改变是在请求网址中,来自

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

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

希望这能解决它。