我是向服务员发送请求的客户端。我的最终目标是在 jsonp 中发送请求。
这是我使用?accept=json
发送请求时收到的服务器响应(因为它不是jsonp而得到无效的会话错误)
{"errorCode":-15,"errorDescription":"SessionNotFoundException - Session not found","success":false,"payload":null}
我可以阅读它,很好。
但,这是?accept=jsonp
的服务器响应:
jQuery171024326910870149732_1351429007451({"action":"", "type":"", "callerId":""}, {"errorCode":0,"errorDescription":"OK","success":true,"payload":null});
它是这两个对象的形式,我不知道如何阅读:{a},{b}
。
当我使用jQuery ajax调用时
服务器数据的输出只是{a}
部分:
Object {action: "", type: "", callerId: ""}
我的两个问题是:
{a},{b}
)的服务器响应是否有效?服务器人通过发送那种对象会出错吗?或者它是否有效?这是我使用的ajax调用:
$.ajax({
url:url,
dataType:'jsonp',
success:function(data){
console.log("data is,"data")
//if the call was success
if (data.success) {
//if errors
} else {
}
}
}
答案 0 :(得分:5)
为了实际验证成功回调不能处理2个参数,我尝试了一个带有2个arg函数的简单测试,并且传入了2个对象:
function test(a,b) {
console.info(a);
}
test({"name":"test"},{"hello":"world"});
这成功了,因为我在JavaScript Object Notation中将两个单独的对象传递给了一个需要2个参数的函数。
接下来,我使用简单的PHP脚本重新创建了一个示例响应:
<?php echo $_REQUEST["callback"]?>({"test":"test"},{"hello":"world"});
所以,下一步,我继续修改成功回调,以便它需要2个参数:
$.ajax({
url:'http://local.sandbox.com/jsonp2/test.php',
dataType:'jsonp',
success:function(data, data2){
console.log("data is " + data2)
//if the call was success
if(data.success) {
alert("yes");
//if errors
} else {
alert(data2.hello);
}
}
});
现在,根据jQuery AJAX Success Handler docs:
,我遇到了问题成功(data,textStatus,jqXHR)
Function,Array一个函数 如果请求成功则调用。该函数传递了三个 参数:
- 从服务器返回的数据,格式为 dataType参数;
- 描述状态的字符串;
- 和jqXHR (在jQuery 1.4.x,XMLHttpRequest中)对象。
从jQuery 1.5开始, 成功设置可以接受一系列功能。每个功能都会 被轮流打电话。这是一个Ajax事件。
- 强调是我的
成功处理程序的第二个参数是始终将成为响应的状态,因此我的输出是控制台中的“数据成功”,并且else块中的警报未定义
jQuery的jsonp实现肯定是为了处理回调中的单个对象而设计的,因为它将自定义值替换为回调查询参数,服务器将其用作“填充”或响应的包装器,通常在表单中“jQuery1232432423432432”。成功处理程序,根据文档,需要3个参数,其中第一个是对象,最后两个由jQuery提供。填充函数只需要1个参数。因此,jQuery无法解决这个问题。
但是,假设您无法控制服务器生成的内容,那么仍有一种技术仍然可以利用现有的服务器端响应。
// this is a custom function to make jsonp requests to the server.
function jsonp(url, callback) {
var script = document.createElement("script");
script.setAttribute("type","text/javascript");
script.setAttribute("src", url + "?callback="+callback + "&cachebuster="+new Date().getTime());
document.getElementsByTagName("head")[0].appendChild(script);
}
要调用该函数,请使用它代替$ .ajax调用,除了传入一个命名的回调函数:
jsonp(url, "myCustomSuccessFunction");
确保定义一个名为success的自定义回调函数:
function myCustomSuccessFunction(data1, data2) {
console.info(data1); // contains first object
console.info(data2); // contains second object
// do stuff w/said objects here
}