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 :
有两件事可以帮到你:
- 不
callback=?
在您的调用失败,因为从您的服务器返回的JSON是无效的JSON(由于您的json数据周围的括号)。 在这种情况下,$.getJSON
将无声地失败。 如果要查看错误,请改用$.ajax
。 - 您的问题可能来自于您显然是在尝试使用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
希望这能解决它。
- jquery ajax readystate 0 responsetext status 0 statustext error
- jQuery.getJSON在IE8中使用gdata json-c无法正常工作。 为什么?
- recaptcha 2.0 – 如何在n次失败尝试/限制后显示?
- 用ajax推送jQuery服务器端
- Ajax变量值为javascript
- 修改getJSON以使用CORS
- 在jquery ajax GET调用中执行ntlm身份validation
- 当webdriver控件在框架中时,返回jQuery.active“)== 0正在等待提供的最大时间,然后引发exception
- jQuery $ .each真的很慢