AngularJS 和跨域 POST

Posted

技术标签:

【中文标题】AngularJS 和跨域 POST【英文标题】:AngularJS and Cross Domain POST 【发布时间】:2013-10-21 00:28:39 【问题描述】:

我对带有 HTTP 授权标头的 CORS 请求有疑问:

在我看来,网络浏览器没有发送带有 POST 请求的授权标头,有什么办法解决这个问题吗?

这是我的 Angular 代码:

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

    app.controller('ctrl', function ($scope, $http) 
        $scope.insert = function () 

            $http.post('http://my.api.com/Insert',
                
                    headers: 
                        'Authorization': 'Basic dGVzdDp0ZXN0',
                        'Content-Type': 'application/x-www-form-urlencoded'
                    ,
                    data: 
                        'Code': 'test data'
                    ,
                    withCredentials: true
                );
        ;
    );

在服务器端,我的 web.config 中有这个

<httpProtocol >
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With" />
    <add name="Access-Control-Allow-Methods" value="GET,POST,PUT,DELETE,OPTIONS" />
    <add name="Access-Control-Allow-Credentials" value="true" />
  </customHeaders>
</httpProtocol>

【问题讨论】:

你找到解决方案了吗? 【参考方案1】:

withCredentials - boolean - 是否在 XHR 对象上设置 withCredentials 标志。有关详细信息,请参阅带有凭据的请求。

【讨论】:

【参考方案2】:

您错误地使用了$http.post。第二个参数是你需要发送到服务器的data,你不能这样设置headers。在您的情况下,它将发送整个对象 作为 JSON 负载

试试这个:

$http(
       url:'http://my.api.com/Insert',
       method:"POST",
       headers: 
                  'Authorization': 'Basic dGVzdDp0ZXN0',
                  'Content-Type': 'application/x-www-form-urlencoded'
       ,
       data: 
              'Code': 'test data'
       
  );

【讨论】:

就是这样,谢谢!我必须解决的另一件事是,如果您有 Access-Control-Allow-Origin:*,则不能使用 withCredentials: true @Veshraj Joshi:你的情况是什么? 所以基本的 dGVzdDp0ZXN0 部分,那是什么? 'dGVzdDp0ZXN0' 代码是强制性的吗? @khanh 我正在尝试使用 Angular js 和域 laravel 5.1(php 框架)在本地机器上制作 html 文件;如果 html 文件在同一个域中,则工作正常;否则不起作用,但令人惊奇的是,“get”方法在任何地方都可以使用上述代码正常工作。 @Dezmen CEO Sykes:“dGVzdDp0ZXN0”代码是强制性的:en.wikipedia.org/wiki/Basic_access_authentication。但它应该根据当前用户具有不同的价值。

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

CefSharp 和跨域

同源策略和跨域-总结

同源和跨域

Websocket 和跨域

jQuery 和跨域 POST 请求

同源策略和跨域