2

我是向服务器人员发送请求的客户端人员。我的最终目标是在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 调用有什么问题,我似乎无法正确阅读它?

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

                }
            }
        } 
4

1 回答 1

5

为了实际验证成功回调不能处理 2 个参数,我尝试了一个简单的测试,其中包含 2 个 arg 函数和 2 个传递给它的对象:

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

test({"name":"test"},{"hello":"world"});

这成功了,因为我在 JavaScript 对象表示法中将两个单独的对象传递给了一个需要 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,这是我遇到问题的地方:

成功(数据,文本状态,jqXHR)

Function, Array 请求成功时调用的函数。该函数传递了三个参数:

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

从 jQuery 1.5 开始,success 设置可以接受一个函数数组。每个函数都会被依次调用。这是一个 Ajax 事件。

  • 重点是我的

成功处理程序的第二个参数始终是响应的状态,所以我在控制台中的输出是“数据成功”,而 else 块中的警报是未定义的。

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

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


解决方案:使用 Script Tag Remoting,不使用 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");

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

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

    // do stuff w/said objects here

}
于 2012-10-28T13:58:05.073 回答