javascript - 该服务器 jsonp 响应是否有效?

标签 javascript jquery ajax json jsonp

我是向服务器发送请求的客户端。我的最终目标是在 jsonp 中发送请求。

这是我使用 ?accept=json 发送请求时得到的服务器响应(并收到无效 session 错误,因为它不是 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}部分:

对象 {action: "", type: "", callerId: ""}

我的 2 个问题是:

  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 {

                }
            }
        } 

最佳答案

为了实际验证成功回调无法处理 2 个参数,我尝试使用 2 个参数函数和传入的 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 :

success(data, textStatus, jqXHR)

Function, Array A function to be called if the request succeeds. The function gets passed three arguments:

  • The data returned from the server, formatted according to the dataType parameter;
  • a string describing the status;
  • and the jqXHR (in jQuery 1.4.x, XMLHttpRequest) object.

As of jQuery 1.5, the success setting can accept an array of functions. Each function will be called in turn. This is an Ajax Event.

  • emphasis is mine

成功处理程序的第二个参数始终将是响应的状态,因此我在控制台中的输出是“数据成功”,并且 else block 中的警报未定义.

jQuery 的 jsonp 实现肯定是为了处理回调中的单个对象而设计的,因为它用自定义值替换回调查询参数,服务器将其用作“填充”或响应的包装器,通常采用以下形式“jQuery1232432423432432”。根据文档,成功处理程序采用 3 个参数,其中第一个是对象,最后 2 个由 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");

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

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

    // do stuff w/said objects here

}

关于javascript - 该服务器 jsonp 响应是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109022/

相关文章:

javascript - JQuery,在先前设置高度后将div高度调整为新内容

javascript - 让 div 在悬停时和事件时更改背景位置

javascript - 我可以向 XMLHttpRequest.send() 传递什么样的参数?

javascript - 将信息从 javascript 传递到 django 应用程序并返回

javascript - 使用ajax生成动态列表

javascript - 为 Javascript 构建自动化和部署

javascript - 快速路由 : route is ignored

javascript - 正则表达式与 while 循环

javascript - 如何在 jquery 中绑定(bind)组合键 ctrl+x+return

javascript - 如何将 JSON 数据显示为 HTML?