【问题标题】:Cross domain ajax request issue跨域ajax请求问题
【发布时间】:2023-04-04 09:04:01
【问题描述】:

我需要从跨域获取json数据。

$.getJSON('http://xx.xx.xx.xx/SampleService/Handler.ashx?callback=?', data, function (jsonData) {
                alert('1');
            })
            .done(function () { console.log("second success"); })
            .fail(function () { console.log("error"); })
            .always(function () { console.log("complete"); });

处理程序代码:

context.Response.ContentType = "application/json";
                SampleService service = new SampleService();

                List<List<Byte>> response = service.GetData();
                string jsonData = JsonConvert.SerializeObject(response);
                context.Response.Write(string.Format("{0}([{1}]);", context.Request["callback"], jsonData));

我得到的错误是:

"parsererror"
Error: jQuery19108131180874027861_1366004862133 was not called

【问题讨论】:

标签: jquery asp.net ajax json jsonp


【解决方案1】:

您看到的 jQuery19108131180874027861_1366004862133 是一个自动生成的回调包装函数,当您不指定回调函数时,jQuery 会附加该函数。即你有回调=?。如果您有权访问正在调用的服务器端脚本,则可以将 JSON 包装在一个函数中,并使用 JSONP 调用它来解决跨域问题。即 - 将您的回调函数命名为 jsonCallback。

服务器端脚本输出:

jsonCallback(
    {
        [insert your json code here]
    }
);

然后是客户端:

(函数($){ var url = 'http://www.jquery4u.com/scripts/jquery4u-sites.json?callback=?';

$.ajax({
   type: 'GET',
    url: url,
    async: false,
    jsonpCallback: 'jsonCallback',
    contentType: "application/json",
    dataType: 'jsonp',
    done: function(json) {
       console.dir(json);
    },
    fail: function(e) {
       console.log(e.message);
    }
});

})(jQuery);

延伸阅读:JQUERY’S JSONP EXPLAINED WITH EXAMPLES

【讨论】:

  • 你也可以加crossdomain: true,
  • 另请注意,自 jQuery 1.9.x 以来,函数 .success() 和 error() 已被弃用,用于 .done() 和 .fail()。
  • @SamDeeringjquery4u.com,使用您的代码后,它既没有到达done 也没有到达fail 部分。我也得到了空响应(在 Firebug 的 Net 标签中)
【解决方案2】:

对跨域请求使用 jsonp 调用。使用类似的东西

$.ajax({
        url : "http://xx.xx.xx.xx/SampleService/Handler.ashx",
        type: "GET",
        dataType: "jsonp",
        jsonp : "callback",
        success: function(data) {alert("Success");},
        error: function(data) { alert("Error"); }

        });        
   });

在你的 php 页面上返回这样的结果

echo $_GET['callback'] . "($result)";exit;

其中 $result 是您的 json_encoded 数组。

【讨论】:

  • @chandresh 您在错误函数的末尾有一个尾随 ,。这可能会导致 IE 浏览器出现问题。
  • 你需要在请求完成时提供callback函数ajax会在那里调用这个函数你做你想做的事
  • @Jai 有效点已编辑问题。谢谢指正。
  • @dianuj 我更新的答案是否与您的说明有关?
  • asp.net not php 尝试在该上下文中回答。