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

时间:2012-10-28 13:05:51

标签: javascript jquery ajax json jsonp

我是向服务员发送请求的客户端。我的最终目标是在 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: ""}

我的两个问题是:

  1. 具有2个对象({a},{b})的服务器响应是否有效?服务器人通过发送那种对象会出错吗?或者它是否有效?
  2. 如何阅读jsonp对象?我的ajax调用有什么问题,我似乎无法正确阅读它?
  3. 这是我使用的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 {
    
                    }
                }
            } 
    

1 个答案:

答案 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无法解决这个问题。

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


解决方案:使用脚本标记远程处理,不使用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

}