“无效的标签”使用JSONP什么时候?(“invalid label” when using JSO

2019-09-16 11:00发布

我有一个问题,我的JSONP请求。该数据将不被显示,萤火虫显示“无效的标签”错误..

我的javascript:

$.ajax({
    url: link,
    dataType: "jsonp",
    beforeSend: function(xhr) {
        var base64 = btoa(username + ":" + password);
        xhr.setRequestHeader("Authorization", "Basic" + base64);
        xhr.overrideMimeType("application/json");
    },
    jsonpCallback: "getResources"
})

function getResources(data) {
    alert(data);
    alert(JSON.parse(data));
    $.each(data.groupStatus, function(i, item) {
        $("body").append("<p>ID: " + item.id + "</p>");
    });
}

我的JSON:

{
    "groupStatus": [
        {
            "id": "Application Layer Configuration-ApplicationLayer",
            "time": 1332755316976,
            "level": 0,
            "warningIds": [],
            "errorIds": []
        },
        {
            "id": "Application Layer-ApplicationLayer:nscalealinst2",
            "time": 1333431531046,
            "level": 0,
            "warningIds": [],
            "errorIds": []
        }
    ]
}

我的HTML:

<html>
<head>
    <title>Monitor</title>
    <link href="css/gadget.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript" src="js/jquery-1.7.2.js"></script>
</head>
<body>
    <div id="content"></div>
    <script type="text/javascript" src="js/gadget.js"></script>
</body>

请求工作正常,但无论如何不显示数据。

林寻找了几天液..谁能帮助我? 先感谢您!

SOLUTION(更新:12年9月6日)

我已经解决了这个问题。 服务器(REST接口)在其上被执行没有回调函数实现..另一种方式来设置的跨域请求,而不使用JSONP是设置以下的jquery变量:

jQuery.support.cors = true;

Answer 1:

到JSONP调用的响应需要来包装JSON本身在函数调用,其中被调用的函数的名称,通常是在URL提供。 jQuery的自动添加的“回调”到被请求的URL,让您的服务器上的脚本应该做同样的事情,以查询字符串参数:

// assuming that $JSON contains your JSON content
print "{$_REQUEST['callback']}( {$JSON} );";

其原因将一个函数来响应的名称是一个JSONP请求实际上是添加到DOM而不是将由XMLHttpRequest对象进行定期请求的脚本代码。 利用JSONP允许浏览器进行,否则将被适用(默认)到XHR跨域策略被阻止跨域请求。



Answer 2:

如果AJAX脚本是在同一个域托管那么你可以使用dataType: "json"是这样的:

function getResources(data, textStatus, jqXHR) {
    console.log(data);
    // no need to do JSON.parse(data)
    $.each(data.groupStatus, function(i, item) {
        $("body").append("<p>ID: " + item.id + "</p>");
    });
}
$.ajax({
    url: link,
    dataType: "json",
    beforeSend: function(xhr) {
        var base64 = btoa(username + ":" + password);
        xhr.setRequestHeader("Authorization", "Basic" + base64);
        xhr.overrideMimeType("application/json");
    },
    success: getResources
});​

如果AJAX脚本在另一个域托管,则服务器必须返回JSONP数据-包函数调用内部的JSON数据:

callback(
    {
        "groupStatus": []
    }
);​

如果服务器返回裸JSON数据,那么你会得到解析错误,因为JSONP请求大致相似注入<script src="...">标签。 要理解为什么裸JSON对象文本原因解析错误,请考虑以下例子:

// WORKS
{
    alert("foo");
}

// PARSE ERROR -- quote from MDN:
// You should not use an object literal at the beginning of a statement.
// This will lead to an error or not behave as you expect, because the { 
// will be interpreted as the beginning of a block.
{
    "foo": "bar"
}

// WORKS
callback({
    "foo": "bar"
})​


文章来源: “invalid label” when using JSONP?