为什么我的ajax获取请求响应错误,即使它成功了?

时间:2015-10-27 19:11:39

标签: json ajax api jsonp cross-domain-policy

我正在尝试从第三方域中检索某些数据。当我输入请求网址时。我能够看到我要求的数据。但是当我尝试使用ajax(到另一个域)进行调用时,它会返回错误消息。为什么我无法检索数据?可能它与跨域策略有关,而不是使用jsonp?这是我的代码:

<script>
    $(document).ready(function() {

            $.ajax ({
                type: 'GET',
                url: 'https://crm.zoho.com/crm/private/json/Potentials/searchRecords?authtoken=xxx&scope=crmapi&criteria=(((Potential%20Email:test2@email.com))&selectColumns=Potentials(Potential%20Name)&fromIndex=1&toIndex=1',               
                dataType: 'json',
                success: function(test) {
                    alert(JSON.stringify(test));
                },
                error: function(test) {
                    alert(JSON.stringify(test));
                }

            });

     });
</script>

1 个答案:

答案 0 :(得分:0)

因为您发送的请求被浏览器阻止了。当您使用对象XmlHttpRequest和明显的javascript执行请求时,浏览器应用WC3中定义的跨域策略,从而在url中验证源域和目标域(协议,主机和端口),如果这些元素位于不同的域中(即主机和端口),然后请求永远不会从浏览器(也就是用户代理)出来。您可以使用jsonp“中断”或“跳转”此策略,只是使用名为“jsonCallback =?”的参数在不同域中定义的资源(src)标记“script”添加在查询字符串中,谁真正接收格式为json的数据。这更难看并且存在安全风险,因此永远不会被使用。 另一种方法是使用和启用“技术”(不止于此),称为“CORS”(跨源请求共享),其中客户端(浏览器)和服务器(不同域的资源),发送,交换和协商一个Http Headers,用于确保发送和接收的人员有权交换信息。实现CORS的基本步骤是:

  1. 在客户端(ajax-jquery)中明确定义CORS将在请求中使用,指定CrossDomain:true。这将启用CORS

  2. 中定义的HTTP标头
  3. 在HTTP Server中指定一个HTTP标头,指示有权调用服务器中托管的资源的域源。最通用的标头可以定义为:Access-Control-Allow-Origin,其值为一个域,如“*”(所有域授权)(Access-Control-Allow-Origin,*)

  4. 在某些浏览器中,有时他们会发送一个名为“预检请求”的http标头请求,就像发现一样来了解服务器是否准备好接收跨源请求。此Http Header包含分配给“OPTIONS”的“Method HTTP”值或“Verb HTTP”(如PUT,POST,GET,DELETE),然后必须配置服务器以使用Method“OPTIONS”接收HTTP Headers,因此允许方法http如PUT,DELETE,POST或GET。一般来说,当请求中有一个方法HTTP“OPTIONS”时,服务器必须有这个头:

  5.   

    访问控制 - 允许 - 方法,“POST,PUT,DELETE,GET,OPTIONS”   Access-Control-Allow-Headers,“,”Content-Type,Accept“

    1. 最后,客户端(ajax)将从服务器接收数据。
    2. 这听起来有点令人困惑,步骤很少,很遗憾没有把代码放到示例中,但是,真的CORS并不难理解。

      我希望这会有所帮助。

      Mozilla的参考资料: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

      这显示什么是CORS,您可以在配置服务器中使用: http://enable-cors.org/