AngularJS:允许跨域 AJAX 请求

Posted

技术标签:

【中文标题】AngularJS:允许跨域 AJAX 请求【英文标题】:AngularJS: allow cross-domain AJAX request 【发布时间】:2016-03-03 07:36:30 【问题描述】:

我正在尝试从我的新 Angular 应用程序调用 REST Web 服务。发出请求时,我收到此错误:

XMLHttpRequest 无法加载 http://localhost:8080/WebService。不 请求中存在“Access-Control-Allow-Origin”标头 资源。 Origin 'http://localhost' 因此不允许访问。

我发现这是因为浏览器不允许这样的操作。

在 *** 中 one of the solutions 是禁用一些安全选项。我试过这样做,但没有成功,我得到了同样的错误。

然后another solution 建议将项目移动到服务器。所以我将我的项目移动到 WAMP 中的 www 文件夹中。它不起作用,因为我需要激活headers_module,然后修改httpd.conf 添加这个:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</IfModule>

所以我激活了模块并修改了通用配置文件(不记得如何在我的 web 项目中执行此操作)并重新启动 WAMP。还是不行。

我唯一能做的就是在 Eclipse JEE 中创建一个 Web 项目并在 Tomcat 服务器上运行它。但我真的不想这样做。

我该如何解决这个问题?

编辑我还尝试将其添加到我的 Angular 应用程序中:

app.config([ '$httpProvider', function($httpProvider) 
    $httpProvider.defaults.useXDomain = true;
    delete $httpProvider.defaults.headers.common['X-Requested-With'];
]);

问题依然存在。

【问题讨论】:

嗨,如果你还没有这样做的话。尝试在您的 Angular 应用程序中添加以下代码,希望问题能够得到解决。 your_app_name.config(['$httpProvider', function($httpProvider) $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; ]); 是的,我忘了说我也试过了。同样的问题。 我可以知道您使用什么作为后端(服务器)吗? 我提到我正在使用 WAMP 并修改了 apache 模块和配置,所以...显然是 Apache。 您必须在 .htaccess 或您可以在 apache Access-Control-Allow-Methods 中配置的任何位置指定此标头:POST、PUT、DELETE、GET、OPTIONS Access-Control-Allow-Headers : X-Requested-With,ORIGIN, Content-type. 【参考方案1】:

我在开发自己的 Web 应用程序时遇到了同样的问题。这是一个 CORS 问题。我为克服它所做的工作称为 JSONP(JSON-Padding)。这种方法完全忽略了 CORS。幸运的是,angularjs $html 服务允许使用 JSONP。

我将向您推荐 angularjs 文档的以下部分:https://docs.angularjs.org/api/ng/service/$http

JSONP 的一个重要概念是回调,它本质上就是您将用来填充(JSONP 中的“P”)JSON 的内容。回调在 http 请求中作为参数传递。

这里是一些示例代码,我在我的 Web 应用程序中使用它们

(我的 php 层隐藏了我的开发者密钥并调用了第三方 api):

$method = isset($_GET['method']) ? $_GET['method'] : '';

//Check for a callback, which is needed for JSONP
if(isset($_GET['callback']))

    //Check which method is being called.
    //I use method to abstract out the long urls of api's
    if($method == 'get_data_a')

        $url = 'https://some.api.url?api_key='.$key;
        $response = file_get_contents($url);

        //Pad the JSON response with a function named after the callback for JSONP
        //You're returning something that looks like
        //myCallbackName(myJSONString);
        echo $_GET['callback'] . '(' . $response . ')';

    
    else if ($method == 'get_data_b')
        ....
    

(我的应用程序代码 - AngularJS)

//I reference my php layer for REST services ; callback=JSON_CALLBACK as per angularjs documentation
var url =  my_php_layer_url + '?method=get_data_a&callback=JSON_CALLBACK';

//Call webservice using angularjs $http and the shortcut method for JSONP
$http.jsonp(url)
    .success(function (result) 
        //do whatever you want with the result; the result is properly formatted JSON
    )
    .error(function (data, status) 
        //do whatever you want with the error
    );

希望对你有所帮助。

【讨论】:

抱歉,网址损坏,我在手机上输入此内容 是的,我也看到了该解决方案。但它只允许 GET 请求。正如我提到的,我的 Web 服务是 REST,所以我需要使用所有不同的 HTTP 动词 :(

以上是关于AngularJS:允许跨域 AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

不允许使用 CORS 使用 angularjs 进行跨域请求的 DELETE 请求

AngularJS实现跨域请求

允许跨域ajax请求

允许跨域 ajax 请求中的标头

聊聊Ajax跨域

如何配置WAMP Apache服务器允许的Ajax跨域请求