.ajax JSONP parsererror

时间:2013-10-17 15:13:47

标签: ajax json jsonp

我正在尝试使用ajax调用从Web api中恢复数据。我写了2个类似的功能,但都不起作用。我可以通过Fiddler看到数据,但是对于以下两个函数,它都不会进入成功调用。我究竟做错了什么?这些数据在Fiddler的两个函数中都有回来,它只是没有取得成功。

这是尝试1:

    function PopulateDivisions()
{
    $.support.cors=true;


    $.ajax({
        type:'GET',
        url:'http://IP/Service/api/DivisionSearch/GetAllDivisions',
        data: {},
        contentType: 'application/json; charset=utf-8',
        dataType: 'jsonp',

        success: function(data) {

                alert(data);

                $("#divisionSelect").append($('<option></option>').val("-99").html("Select One"));
            $.each(data, function(i, item){
                $("#divisionSelect").append($('<option></option>').val(item.Name).html(item.Name));
            });
        },
        error: function(xhrequest, ErrorText, thrownError) {
            alert("Original: " + thrownError + " : " + ErrorText);
        }
    });

}

错误:未调用jQuery19102671239298189216_1382022403977:解析器错误

以下是Fiddler展示的数据:

    [{"Id":1,"Description":"Executive","Name":"Executive "},{"Id":2,"Description":"ASD","Name":"Administrative Services Division "},{"Id":3,"Description":"COM","Name":"Communications "},{"Id":4,"Description":"CP","Name":"Contracts and Procurement "},{"Id":5,"Description":"PMD","Name":"Program Management Division "},{"Id":6,"Description":"RED","Name":"Research and Evaluation Division "},{"Id":7,"Description":"IT","Name":"Information Technology "}]

这是尝试#2:

    function PopulateDivisions2()
{


    $.support.cors=true;


    $.ajax({
        type:'GET',
        url:'http://IP/Service/api/DivisionSearch/GetAllDivisionsJsonP',
        data: {},
        contentType: 'application/json; charset=utf-8',
        dataType: 'jsonp',
        jsonp: false,
        jsonpCallback: "myJsonMethod",

        success: function(data) {
                //data = JSON.parse(data):
                alert(data);

                $("#divisionSelect").append($('<option></option>').val("-99").html("Select One"));
            $.each(data, function(i, item){
                $("#divisionSelect").append($('<option></option>').val(item.Name).html(item.Name));
            });
        },
        error: function(xhrequest, ErrorText, thrownError) {
            alert("PopulateDivisions2:  " + thrownError + " : " + ErrorText);
        }

    });

}

错误:未调用myJsonMethod:parsererror

以下是Fiddler所展示的数据:

    "myJsonMethod([{\"Id\":1,\"Description\":\"Executive\",\"Name\":\"Executive \"},{\"Id\":2,\"Description\":\"ASD\",\"Name\":\"Administrative Services Division \"},{\"Id\":3,\"Description\":\"COM\",\"Name\":\"Communications \"},{\"Id\":4,\"Description\":\"CP\",\"Name\":\"Contracts and Procurement \"},{\"Id\":5,\"Description\":\"PMD\",\"Name\":\"Program Management Division \"},{\"Id\":6,\"Description\":\"RED\",\"Name\":\"Research and Evaluation Division \"},{\"Id\":7,\"Description\":\"IT\",\"Name\":\"Information Technology \"}]);"

2 个答案:

答案 0 :(得分:2)

contentType: 'application/json; charset=utf-8'告诉您的服务器您正在发送JSON数据,但您没有发送任何数据。尝试离开那个设置。

如果你在浏览器中看到url,你会得到json吗?

我不确定这是否重要,但我会删除error设置,因为它在jQuery Ajax documentation This handler is not called for cross-domain script and cross-domain JSONP requests中说明了。

我会尝试使用最少量的配置来运行它:

$.ajax({
    url:'http://IP/Service/api/DivisionSearch/GetAllDivisions',
    dataType: 'jsonp',
    success: function(data) { console.log(data); }
});

看看它是否有效,然后在它之上构建。没有jsfiddle,很难调试正在发生的事情。

以下链接应该是您的好资源:Basic example of using .ajax() with JSONP?

答案 1 :(得分:0)

 function PopulateDivisions2(){
$.support.cors=true;
$.ajax({
    type:'GET',
    url:'http://IP/Service/api/DivisionSearch/GetAllDivisionsJsonP?callback=?',
    data: {},
    contentType: 'application/json; charset=utf-8',
    dataType: 'jsonp',
    jsonpCallback: "myJsonMethod" });


function myJsonMethod(data) {
            //data = JSON.parse(data):
            alert(data);$("#divisionSelect").append($('<option></option>').val("-99").html("Select One"));
        $.each(data, function(i, item){
            $("#divisionSelect").append($('<option></option>').val(item.Name).html(item.Name));
        });
    }}

你能试试上面的代码吗?我已经删除了成功回调并在查询字符串中包含了回调。