Angular 5配置请求头携带JWT Token与Content-Type(弃用API解决方案)
解决Angular 5中HttpClient配置JWT Token与Content-Type的问题
嗨,我来帮你搞定这个问题!你遇到的情况是因为Angular 4.3之后引入了HttpClient(也就是你用的@angular/common/http里的那个),它已经取代了旧的Http服务,对应的Headers和RequestOptions也被弃用了,取而代之的是HttpHeaders和直接在请求里传入配置对象。
方法一:直接在服务中配置请求头
先修改你的UserService代码,替换掉旧的API:
import {Injectable} from '@angular/core'; import {HttpClient, HttpHeaders} from "@angular/common/http"; // 导入HttpHeaders import 'rxjs/add/operator/map' @Injectable() export class UserService { private requestHeaders: HttpHeaders; constructor(private http: HttpClient) { const token = localStorage.getItem('theuser'); // 使用HttpHeaders创建请求头,注意它是不可变的,每次set都会返回新实例 this.requestHeaders = new HttpHeaders() .set('Content-Type', 'application/json') .set('Authorization', `Bearer ${token}`); // 用模板字符串更简洁 } userInfo() { // HttpClient的请求方法第二个参数是配置对象,直接传入headers return this.http.get<any>("http://localhost:8000/user-detail/", { headers: this.requestHeaders }) } }
方法二:使用HTTP拦截器(更推荐的方式)
如果你的项目里多个请求都需要携带这两个请求头,写在每个服务里太麻烦,用HTTP拦截器可以全局统一处理,一劳永逸:
- 创建一个拦截器文件
auth.interceptor.ts:
import { Injectable } from '@angular/core'; import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; import { Observable } from 'rxjs'; @Injectable() export class AuthInterceptor implements HttpInterceptor { // 拦截所有HttpClient请求 intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { const token = localStorage.getItem('theuser'); // 如果有token,就克隆请求并添加请求头 if (token) { const authenticatedReq = req.clone({ headers: req.headers .set('Content-Type', 'application/json') .set('Authorization', `Bearer ${token}`) }); return next.handle(authenticatedReq); } // 没有token就直接放行原请求 return next.handle(req); } }
- 在
app.module.ts中注册这个拦截器:
import { NgModule } from '@angular/core'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; import { AuthInterceptor } from './auth.interceptor'; // 替换成你的文件路径 @NgModule({ declarations: [/* 你的组件 */], imports: [/* 你的模块 */], providers: [ { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true // 允许多个拦截器存在 } ], bootstrap: [/* 根组件 */] }) export class AppModule { }
用拦截器的话,你所有的HttpClient请求都会自动带上指定的请求头,不用再在每个服务里重复配置啦!
内容的提问来源于stack exchange,提问作者moh
相关产品推荐
相关产品推荐

