• 为什么返回的数据前面有callback?


    这是一个同学出现的问题,问到了我。

    应该是这样的:

    但问题是这样的:

    我看了所请求的格式和后台要求的也是相同的。而且我也是这种做法,为什么他的就不行呢?

    打了几遍 JSON.parse 也都是不行……然后也不知道什么情况的耿耿于怀的回去了。

    后来在网上搜索,结果都不是想要的。

    把 callback 字符串截取掉,这个就不用说咯。这是一种把 json 弄出来的方法。但并不是要问的问题。要问的是:

    为什么返回的数据前面会加上 callback ,括号里才是 json 内容。

    知乎相似问题:

    调用一个api,返回数据格式是:jsonCallback(括号里面才是json),该怎么处理?

      

    百度知道相似问题:

    如何在这组返回的数据中获取data对应字符串中jsonCallBack函数并通过其调用?

      

    var jsonback = function (json) {
        return json;
    };
    var jsonObj = eval(obj.data);
    
    //或
    
    var jsonStr = JSON.parse(obj.data.match(/^jsonback((.*));$/)[1]);

    csdn相似问题:

    关于jsonp返回回来的数据怎么解析
    jQuery18307755723037111298_1402151229915([{ "list": [{ "id": 1, "title": "title 1" }, { "id": 2, "title": "title 2" }, { "id": 3, "title": "title 3"}] }])

    //jq的代码是这样子的
    function loadInfo() {
        var url = "http://192.168.100.101:81/A.aspx";
        $.ajax({
            type: "get",
            async: true,
            url: url,
            dataType: "jsonp",
            jsonp: "callback",
            //服务端用于接收callback调用的function名的参数
            success: function(data) {
                alert(data.list);
                //这个地方报错是,不是一个函数
            },
            error: function() {
                alert("error");
            }
        });
    }
    View Code

    就没几个人回答 “为什么”,最多都在说 “怎么做”?

    好吧。通过自己的研究。发现问题是这样的:

    如果把 dataType:"jsonp" 的 dataType 写错,就会出现这种情况。其实也相当于没有传 dataType 这个参数。

    但是如果把 "jsonp" 写错,就触发请求失败的函数了 error:function(){} 。

    那么问题又来了,像上面 csdn 中的 dataType 好像没写错哟,那返回那样的数据格式 jQuery...([]) 是什么鬼?我想,可能 () 括号前面的 jQuery... 就像 上面其他情况中的 callback、jsonback 一样,相当于一种名字吧。 jsonp 和 json 是与之对应的。但 jQuery... 就不知道要如何与之对应了。所以就解析不了。

    扩展阅读:

    $.getJSON()方法跨域 去取得服务器的json对象的时候,url的后缀最后带一个"callback=?"的参数作为成功的回调函数;如:

    var url = "${BIPJS}/intf/accountsOfRefuseEmail.jsp?act=add&siteId=${LANG.siteId}&accountId=${loginId}&callback=?";
    $.getJSON(url, {} , function(data) {  
                var code = data.code;  
                if(code == 0){  
                    $('#floatOne').myFadeIn();  
                }  
            });

     此时返回的data是一个json对象;相应地,服务器返回字符串应该要这种样式:

    String callback = T.stringValue(getRequestParams(request,"callback"),"");
    
    JSONObject jo = new JSONObject();
    
    // put key/value in jo
    
    out.print(callback + "(" + jo + ")");

    原理:Jquery在解析请求callback=?的时候,会自动生成一个callback=jsonp***的字符串,这个字符串jsonp***在成功回调的时候作为一个方法,被Jquey自动执行,参数是一个json格式的字符串(这里是data)。相应地;服务器返回的字符串要这种形式:jsonp***(JSONObject)。

    如:刚上面的url被Jquey解析成:

    1. Request URL:
      http://localhost.pcauto.com.cn:12385/intf/accountsOfRefuseEmail.jsp?act=add&siteId=2&accountId=388&callback=jsonp1381976698163&_=1381976708919

    服务器返回的字符串形式:

    jsonp1381976698163({"code":0,"msg":"增加用户成功"})

    Jquery的回调方法jsonp1381976698163(jsonStr)就是要把字符串jsonStr转换成josn对象,这里就是转换成data这个json对象。

  • 相关阅读:
    vue路由篇(动态路由、路由嵌套)----动态路由下再嵌套子路由
    文件、I/O重定向、文本
    Linux基础命令
    Chrome开发者工具(DevTools)使用技巧
    Grid网格布局知识点整理
    Javascript常见数组、字符串API整理
    css 实现瀑布流布局效果
    实时校验输入框内容
    app里遇见的小问题总结
    修复bug: iOS特性会滚动会引起白屏 ,使用 will-change: transform;
  • 原文地址:https://www.cnblogs.com/daysme/p/6541552.html
Copyright © 2020-2023  润新知