【问题标题】:how to call cross-domain web api using ajax?如何使用ajax调用跨域web api?
【发布时间】:2025-12-12 02:45:02
【问题描述】:
jQuery.ajax({
           type: "GET",
           url: 'http://example.com/restaurant/VeryLogin(username,password)',
           dataType: "json",

           success: function (data) {
               alert(data);
           },
           error: function (XMLHttpRequest, textStatus, errorThrown) {
               alert("error");
           }
       });

它提示成功,但数据为空。 url返回xml数据,如果我们指定dataType我们可以得到json数据,但是这里没有得到任何数据。

任何帮助表示赞赏。

【问题讨论】:

    标签: asp.net ajax wcf-web-api


    【解决方案1】:

    Javascript 遵循相同的域政策。这意味着为了安全起见,客户端浏览器中的 JS 脚本只能访问它来自的域。

    JSONP 不受相同限制。

    在此处查看有关 JSONP 的 jQuery 文档:

    http://api.jquery.com/jQuery.getJSON/

    这是一个使用 JSONP 通过 JQuery AJAX 访问跨域服务的工作示例:

    http://jsbin.com/idasay/4

    以防万一 JSBIN 将来删除此粘贴:

    jQuery.ajax({
         type: "GET",
         url: 'http://api.geonames.org/postalCodeLookupJSON?postalcode=6600&country=AT&username=demo',
         dataType: "jsonp",
         cache: false,
         crossDomain: true,
         processData: true,
    
    
         success: function (data) {
             alert(JSON.stringify(data));
         },
         error: function (XMLHttpRequest, textStatus, errorThrown) {
             alert("error");
         }
     });
    

    【讨论】:

    • 我已经点击了链接,但没有产生结果。
    • 来自之前发布的链接:“由于浏览器安全限制,大多数“Ajax”请求都受制于同源策略;请求无法成功从不同的域、子域或协议中检索数据. 脚本和 JSONP 请求不受同源策略限制。”
    • 我建议看看如何使用上面链接中的 JSONP 示例来实现您所需要的。
    • 我也试过 jsonp 但没有结果。如果我在不指定内容的情况下直接替换生成 json 数据的 url 意味着添加 url+&json,我得到响应。但没有得到任何 xml 响应。
    • 如果你请求jsonp,你不会在响应中得到任何xml,你会得到JSON。 xhr.responseText 应该包含返回的 JSON。
    【解决方案2】:

    不改变后端,直接使用Ajax获取跨域数据是不可能的。它叫做Same origin policy

    您可以在后端(how do to this)中设置特殊标头Access-Control-Allow-Origin。或者你可以使用JSONP

    【讨论】:

      【解决方案3】:

      查找 jsonp 数据类型。

      jQuery.ajax({
             type: "GET",
             url: 'http://xxx.com/restaurant/VeryLogin(username,password)',
             dataType: "jsonp",
         cache: false,
             crossDomain: true,
         processData: true,
      
             success: function (data) {
                 alert(data);
             },
             error: function (XMLHttpRequest, textStatus, errorThrown) {
                 alert("error");
             }
         });
      

      【讨论】:

      • 我关注了你的更改,但还没有结果。
      • 您必须阅读有关 jsonp 的信息。但是,您正在调用的页面没有返回 jsonp 数据。
      【解决方案4】:

      这里有一篇很棒的文章来进行 GET 和 POST 跨域调用: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

      这对我帮助很大....为任何查询拍摄 cmets。

      【讨论】: