跨域Ajax请求

14

我想从跨域URL获取HTML响应页面。

为此,我使用ajax请求方式,如下:

 $.ajax({
            type: 'GET',
            url: "http://wcidevapps.com/salescentral/idisk/0001000383/iDisk",
            dataType: "json",
            success: function (response) {
                $(response).find('li a').each(function () {
                    listHref.push($(this).attr('href'));
                });

            }
        });

但是在请求后,它没有回应任何结果。


3
你是否启用了CORS?http://enable-cors.org/ - Tim Büthe
啊,好的,我明白了。所以,通常情况下,JavaScript是不允许从其他域加载内容的。这被称为同源策略。但现在,你可以通过配置CORS或使用诸如JSONP之类的技巧来绕过这个限制。 - Tim Büthe
不用担心CORS,因为JSONP并不是真正的ajax请求,所以你不需要它。问题在于你用于请求的地址根本没有返回JSONP。 - adeneo
1
你尝试过这些答案中的任何一个吗? - radu florescu
提供一个可工作的 jsfiddle.net。 - radu florescu
显示剩余2条评论
4个回答

7
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
  <script type="text/javascript">
    function NameAFunctionName() {
        $.ajax({
          url: 'http://wcidevapps.com/salescentral/idisk/0001000383/iDisk',
          type: 'GET',
          dataType: 'json',
          headers: {
            //WRITE IF THEIR HAVE SOME HEADER REQUEST OR DATA
          },
          crossDomain: true,
          success: function (data, textStatus, xhr) {
            console.log(data);
          },
          error: function (xhr, textStatus, errorThrown) {
            console.log(errorThrown);
          }
        });
    }   
</script>

5

查看文档: http://api.jquery.com/jQuery.ajax/

crossDomain (默认为false,用于同域请求;true,用于跨域请求)

类型:布尔值

如果你想在同一域上强制执行跨域请求(例如JSONP),请将crossDomain的值设置为true。这允许服务器端重定向到另一个域。 (版本添加:1.5)


4

我怀疑你看到这个问题是因为你请求的页面不会响应json(p)响应,而是重定向到:

http://wcidevapps.com/salescentral/idisk/0001000383/iDisk/

(注意末尾斜杠)

然后返回内容类型:

Content-Type:text/html;charset=ISO-8859-1

编辑:如果你的意图是跨域检索以上网站的数据,进一步解析你的脚本,我建议你选择以下之一:

假设1:您控制服务器“http://wcidevapps.com”上的页面

在这种情况下,你有两个选项:要么添加CORS头“Access-Control-Allow-Origin: *”到响应中(并将客户端ajax()调用配置为dataType:“html”),要么创建一个特殊的JSON(P)页面,以JSON格式(带有填充)提供相同的数据(并像OP一样配置客户端ajax()调用,使用dataType:“jsonp”)

假设2:您不控制服务器http://wcidevapps.com上的页面

在这种情况下,我能想到的唯一选择是在你控制的站点上设置一个代理。让该代理将请求/响应代理到“http://wcidevapps.com”,但在响应中添加CORS头“Access-Control-Allow-Origin: *”(并将客户端ajax()调用配置为dataType:“html”)。


它不起作用是因为数据没有以JSON格式返回,并且会抛出异常"Uncaught SyntaxError: Unexpected token <"。 - Rahul_RJ
你也可以尝试使用我提供的网站链接。 - Rahul_RJ
是的,@Rahul,所以我认为你唯一的选择就是我在编辑后答案中提供的那些选项。 - marty

3
如果您正在使用asp.net web服务,则需要将以下内容添加到webconfig文件中;
<system.webServer>
    <directoryBrowse enabled="true"/>
<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type" />
  </customHeaders>
</httpProtocol>
</system.webServer>

为什么启用directoryBrowse?有什么原因吗? - Buddhima Naween Rathnayake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接