duandong1963 2012-12-23 00:09
浏览 142
已采纳

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

Update IV / Current status: I've now confirmed trough another question that the character encoding of the file is fine and not the cause of the problem. I've also tested against another server and the error still persists. It does however work towards localhost. So to summarize: JSONP call works towards localhost, but when running against external domains the response from the server is empty (no header / no http response code). When copying the requested URL and inserting it directly in a browser, the output is correct with correct formating (utf-8 / json).

Fiddle: http://jsfiddle.net/5SJvp/1/

Update III: I'm now able to get it working succesfully on localhost. However, using the exact same code (both client and server) towards my production domain it still fails. The response from the server is "empty" meaning to say it returns no http status code.

Update II: After some more debugging I noticed that the response does not include an http status code. This probably is the cause of my problem? I assume this means there is something wrong server side, but I cannot for the life of me see where.

Update I: Snip from jQuery where to request seems to halt.

// 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 (from Firebug)

_   1356655864905
callback    jQuery18308375673194150332_1356655863817
p   0522
pl  12
s   false
secret  ##############################
u   request12341299

Request (from 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

Original question:

I'm struggling with what seems to be a common problem, but I've yet to find a solution. I'm trying to execute a very simple jsonp call using jQuery. The problem is that either a) nothing is happening or b), the response from the server is empty.

I've tried several different approaches, using both the $.ajax method and the $.getJSON method. Both produce the same faulty result. Using the code below nothing happens: Using the Chrome debugger I can see that it simply stops its execution halffway trough the method. However using Wireshark I can see that the client performs the three way handshake and thusly prepars to send data, it just fails to do that.

If I remove the callback=? it does execute, however the response is malformed (or at least, I think so since I can only see a response marked with a red line in 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");
     }
 }); 

Server code ($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;       
?>

Here is the server response with manually typed input.

funcName({"message":"!0b7(cb6Gv40","status":"OK","length":12})
  • 写回答

6条回答 默认 最新

  • dongshu7162 2013-01-01 04:34
    关注

    This will obviously NOT work if you did not set up your SSL certificates properly.

    This works properly when I transform the https to 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");
        }
    });
    

    You can tell if you have bad SSL installation when "https://serve.pin2pass.com?index.php" leads to a risky page. Maybe you never intended to put it in https mode ?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器