此服务器jsonp响应是否有效?

Alo*_*lon 2 javascript ajax jquery json jsonp

我是向客户端发送请求的客户端.我的最终目标是在jsonp中发送请求.

这是我发送请求时得到的服务器响应?accept=json(并且因为它不是jsonp而得到无效的会话错误)

{"errorCode":-15,"errorDescription":"SessionNotFoundException - Session not found","success":false,"payload":null}
Run Code Online (Sandbox Code Playgroud)

我可以读它,它很好.

但是,这是服务器响应?accept=jsonp:

jQuery171024326910870149732_1351429007451({"action":"", "type":"", "callerId":""}, {"errorCode":0,"errorDescription":"OK","success":true,"payload":null});
Run Code Online (Sandbox Code Playgroud)

它是这两个对象的形式,我不知道如何阅读:{a},{b}.

当我使用jQuery ajax调用时,服务器数据的输出只是{a}部分:

Object {action: "", type: "", callerId: ""}

我的两个问题是:

  1. 具有2个对象({a},{b})的服务器响应是否有效?服务器人通过发送那种对象会犯错误还是有效?
  2. 我如何读取jsonp对象?我的ajax调用有什么问题,我似乎无法正确阅读它?

这是我使用的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 {

                }
            }
        } 
Run Code Online (Sandbox Code Playgroud)

jmo*_*253 5

为了实际验证成功回调不能处理2个参数,我尝试了一个带有2个arg函数的简单测试,并且传入了2个对象:

function test(a,b) {
    console.info(a);
}

test({"name":"test"},{"hello":"world"});
Run Code Online (Sandbox Code Playgroud)

这成功了,因为我在JavaScript Object Notation中将两个单独的对象传递给了一个需要2个参数的函数.

接下来,我使用简单的PHP脚本重新创建了一个示例响应:

<?php echo $_REQUEST["callback"]?>({"test":"test"},{"hello":"world"});
Run Code Online (Sandbox Code Playgroud)

所以,下一步,我继续修改成功回调,以便它需要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);
                }
            }
        }); 
Run Code Online (Sandbox Code Playgroud)

现在,根据jQuery AJAX Success Handler文档,我遇到了问题:

成功(data,textStatus,jqXHR)

Function,Array如果请求成功,则调用的函数.该函数传递三个参数:

  • 从服务器返回的数据,根据dataType参数格式化;
  • 描述状态的字符串;
  • 和jqXHR(在jQuery 1.4.x,XMLHttpRequest)对象.

从jQuery 1.5开始,成功设置可以接受一系列函数.每个函数将依次调用.这是一个Ajax事件.

  • 重点是我的

成功处理程序的第二个参数始终是响应的状态,因此我的输出是控制台中的"数据成功",而else块中的警报未定义.

jQuery的jsonp实现肯定是为处理回调中的单个对象而设计的,因为它将自定义值替换为回调查询参数,服务器将其用作"填充"或响应的包装器,通常采用"jQuery1232432423432432"形式.成功处理程序,根据文档,需要3个参数,其中第一个是对象,最后两个由jQuery提供.填充函数只需要1个参数.因此,jQuery无法解决这个问题.

但是,假设您无法控制服务器生成的内容,则仍有一种技术仍然可以利用现有的服务器端响应.


解决方案:使用脚本标记远程处理,不使用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);
}
Run Code Online (Sandbox Code Playgroud)

要调用该函数,请使用它代替$ .ajax调用,除了传入一个命名的回调处理程序:

jsonp(url, "myCustomSuccessFunction");
Run Code Online (Sandbox Code Playgroud)

确保定义一个自定义的命名成功回调函数:

function myCustomSuccessFunction(data1, data2) {
    console.info(data1);  // contains first object
    console.info(data2);  // contains second object

    // do stuff w/said objects here

}
Run Code Online (Sandbox Code Playgroud)