【问题标题】:XMLHttpRequest cannot load is not allowed by Access-Control-Allow-OriginAccess-Control-Allow-Origin 不允许 XMLHttpRequest 无法加载
【发布时间】:2013-06-14 03:32:50
【问题描述】:

我正在尝试访问 education.com API 数据。但是,我不断收到错误状态的错误消息:

XMLHttpRequest 无法加载 http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json。 Access-Control-Allow-Origin 不允许 Origin。

我的代码如下:

$(function(){
    $.getJSON('http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json', 
    function(data) {
        console.log(data);
    });
});

有人可以帮帮我吗?

【问题讨论】:

标签: javascript jquery json api getjson


【解决方案1】:

一篇关于Cross Domain AJAX的文章不久前在这里发布:

CROSS DOMAIN AJAX REQUEST WITH JSON RESPONSE FOR IE,FIREFOX,CHROME, SAFARI – JQUERY

如果您可以控制响应服务器,处理此问题的最简单方法是为以下内容添加响应标头:

Access-Control-Allow-Origin: *

这将允许跨域 AJAX。在 PHP 中,您需要像这样修改响应:

<?php header('Access-Control-Allow-Origin: *'); ?>

您可以将 Header 设置 Access-Control-Allow-Origin * 设置在 apache conf 或 htaccess 文件中,它就像一个魅力一样工作

重要提示:
通配符将允许任何域向您的主机发送请求。我建议将星号替换为您将在其上运行脚本的特定域。

【讨论】:

  • 不幸的是,我无法控制响应服务器。 ://
【解决方案2】:

除非education.com 服务器配置为允许CORS (Cross-Origin Resource Sharing) 请求(即Access-Control-Allow-Origin 位),否则您无法使用浏览器执行此操作。

但是,您的服务器可以代表您发出请求,然后您可以从那里检索数据。

【讨论】:

    【解决方案3】:

    在ZF1中可以做如下:

      public function indexAction() {
        $turnkey = array(
            "uris" => array("176.x.x:3478", "3478"),
            "username" => "my_username",
            "password" => "my_password"
        );
    
        $content = Zend_Json::encode($turnkey);
        $this->getResponse()
                ->setHeader('Access-Control-Allow-Origin', "*")
                ->setHeader('Content-Type', 'application/json')
                ->setBody($content)
                ->sendResponse();
        exit;
      }
    

    【讨论】:

      【解决方案4】:

      与其说是解决问题的方法,不如说是避免问题的技巧——在没有网络安全的情况下启动浏览器:

      in MacOS this would work as follows: cd to ../../Applications/Google\ Chrome.app/Contents/MacOS
      then start the brwoser with the appropiate flag: Google\ Chrome --disable-web-security'
      

      注意:切勿使用浏览器进行正常上网,这只是为了在紧急情况下帮助您! 干杯

      【讨论】:

      • 在 Linux 中运行 google-chrome --disable-web-security 并不能解决这个问题。如果这真的适用于 Mac,我会感到惊讶......
      猜你喜欢
      • 2013-01-24
      • 2012-05-25
      • 1970-01-01
      • 2012-09-28
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-15
      • 2011-09-22
      相关资源
      最近更新 更多