0

我有一个预先存在的角度代码,可以从 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'
                }
            });
        }

当 GET 调用被触发并在 Chrome 中按 F12 时,我收到以下错误消息:

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

-1 的返回状态,并且没有调用到服务器端的迹象。

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

如果我在Postman中尝试使用标题中相同的 Authorization 值进行GET 调用,这也可以正常工作。

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

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

我尝试过的其他事情:

  • 随机标头名称会导致相同的问题。
  • 我添加了'Content-Type' = 'text/plain; charset=utf-8'作为标题。这对结果没有任何改变

我正在使用角度 1.5.6

4

2 回答 2

2

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

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

于 2016-10-21T15:54:57.107 回答
0

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

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

通过在我的后端 Web API 中的 Application_BeginRequest() 方法中添加以下内容,Pre-flight 现在通过并且我的应用程序继续。

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();
}
于 2016-10-24T16:06:33.563 回答