You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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拦截器可以全局统一处理,一劳永逸:

  1. 创建一个拦截器文件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);
  }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:55:28