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

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

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

更新III:我现在能够在localhost上成功运行它。 但是,对我的生产域使用完全相同的代码(客户端和服务器)仍然会失败。 来自服务器的响应是“空的”意味着它不返回http状态代码。

更新II:经过一些调试后,我注意到响应不包含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 ); 

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,我可以看到客户端执行三次握手,因此预先准备发送数据,它只是没有这样做。

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

  $message, "status" => $statuscode, "length" => strlen($message) ); echo $callback . '('.json_encode($data) .')'; exit; ?> 

这是具有手动输入的服务器响应。

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

如果您没有正确设置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模式?

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

似乎问题可能在于你如何使用json_encode,因为你在添加callback =时写了这个? param的反应看起来很糟糕。 建议的测试可以让您更好地诊断出问题所在。

callback是jsonp的包装函数名称的通用GET参数。 当你使用callback=? 在jQuery请求中,jQuery会解析? 带有时间戳的其他东西,所以它总是一个独特的价值。 API服务器将json包装在这个唯一的函数名中,jQuery存储该名称,以便它可以使用它来解包响应。

某些API不灵活,需要自己的特定名称,在这种情况下,您可以在$.ajax使用jsonpCallback选项,或者在$.ajaxSetup全局设置它。

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

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

test.php:

  'test', "status" => 200, "length" => strlen('test') ); echo $callback . '('.json_encode($data) .')'; exit; 

test.html

         

有两件事可以帮到你:

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

希望能帮助到你

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

如果你可以给你的应用程序一个完整的url,我可以为你测试=)

因此,随着新的小提琴,它更容易工作。 这是你电话的工作样本 –

 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

希望这能解决它。