Angularjs:为什么添加授权头会导致-1状态响应?

时间:2016-10-21 15:50:47

标签: angularjs asynchronous http-post restier

我有一个预先存在的角度代码,可以从API获取数据。我正在尝试为请求添加身份验证令牌。

首先,我尝试了一个简单的例子

.factory('getDep', [
        '$resource', function($resource) {
            return $resource('/ContactsDatabaseAPI/deps/:id', { id: '@id' }, {
                query: {
                    method: 'GET',
                    isArray: false,
                    headers: {
                        'Authorization': 'Bearer ' + token
                    }
                },
                create: {
                    method: 'POST'
                },
                update: {
                    method: 'PUT'
                },
                remove: {
                    method: 'DELETE'
                }
            });
        }

在Chrome中触发GET调用和F12-ing时,收到错误消息:

angular.js:11821 OPTIONS http://localhost:56057/ContactsDatabaseAPI/deps net::ERR_CONNECTION_RESET

返回状态为-1,并且没有呼叫的标志使其进入服务器端。

没有标题行,它可以正常工作。

如果我在标题中使用相同的授权值尝试 Postman 中的GET调用,这也可以。

我还尝试在httpInterceptor中添加标头并获得相同的结果:

config.headers = config.headers || {};
config.headers.Authorization = 'Bearer ' + authData.token;

我尝试过的其他事情:

  • 随机标题名称会导致同样的问题。
  • 我已添加' Content-Type' =' text / plain; charset = utf-8' 作为标题。结果没有变化

我使用的是角1.5.6

2 个答案:

答案 0 :(得分:2)

试试这个(在控制器中):

$ http.defaults.headers.common.Authorization =' Bearer' +令牌;

答案 1 :(得分:0)

我已经解决了我的问题,感谢@ Mourad-Idrissi指出我正确的方向。

之前的原因是在API运行之前没有进行飞行前检查。当我添加标头时,这改变了客户端与API通信的方式。现在有一个OPTIONS调用API导致错误。由于领域不同,这引入了我对CORS的世界。

通过在我的后端Web API中将以下内容添加到我的Application_BeginRequest()方法,现在飞行前通过,我的应用程序继续。

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
    HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization");
    HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
    HttpContext.Current.Response.End();
}