【问题标题】:Any ideas how can I add header to this function?任何想法如何向此函数添加标题?
【发布时间】:2018-02-26 08:45:47
【问题描述】:

任何想法如何将标题添加到下面显示的函数中?我创建了登录服务,并获得了响应状态 200。但是,当我尝试发送 GET 请求时,我得到Failed to load resource: the server responded with a status of 403 (Forbidden).

  func() {
    return this.http.get('/data', )
        .map(response => response.json())
        .subscribe(response2 => this.response2 = response2);
}

我的 GET:

get(url: string, options?: RequestOptionsArgs): Observable<Response> {
    return super.get(appConfig.apiUrl + url, this.addJwt(options)).catch(this.handleError);
}

 private addJwt(options?: RequestOptionsArgs): RequestOptionsArgs {
        // ensure request options and headers are not null
        options = options || new RequestOptions();
        options.headers = options.headers || new Headers();

        // add authorization header with jwt token
        let currentUser = JSON.parse(localStorage.getItem('currentUser'));
        if (currentUser && currentUser.token) {
            options.headers.append('Authorization', 'Bearer ' + currentUser.token);
        }

        return options;
    }

解决方案 问题是后端希望令牌以Token 132083128901302 的形式发送,但我发送的是Bearer 132083128901302。将 Bearer 更改为 Token 后一切正常。

【问题讨论】:

  • 看起来您已经在注释 // add authorization header with jwt token 的位置添加了标题。您认为缺少哪个标头?
  • 仅供参考,.subscribe() 绝对是错误的。 .catch(this.handleError); 更糟糕,直接来自 Angular 官方指南(必须是 .catch(e =&gt; this.handleError(e));)。 Angular 官方指南的道德是完全可怕的。沃德·贝尔,你真丢脸。
  • 即使从.subscribe() 更改为.subscribe(response2 =&gt; this.response2 = response2);,代码仍然是错误的,因为您不想从LoginService 中的服务调用返回订阅,而只是返回Observable。除非你在一个不好的组件中直接使用Http
  • 我创建这个函数只是为了测试是否正确添加了标题

标签: angular rest typescript token


【解决方案1】:
let headers = new Headers({ 'Authorization': 'Bearer ' + jwt });
let options = new RequestOptions({ headers: headers });
return this.http.get('http://test.dev/get/user', options).map(res => res.json());

我强烈建议您通过 HttpClient 模块使用拦截器。易于实现,应用程序代码更少,更易于管理。

【讨论】:

  • 但是这段代码只用了一次。登录头自动添加后,你的解决方案和我的解决方案没有区别,不是吗?
  • 不,根本没有什么不同。这就是为什么我说使用拦截器。我给你的代码只是作为一个解决方案。我会为你链接一个教程,或者你可以自己搜索,因为有很多关于如何实现 Angular 拦截器的教程。拦截器就像一个中间件,对于每个请求,它们都会自动添加标头,然后处理请求。所以你只需要在一个地方添加标题。 medium.com/@ryanchenkie_40935/…
猜你喜欢
  • 2016-09-06
  • 2021-12-14
  • 2016-07-14
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
  • 2016-12-16
相关资源
最近更新 更多