【问题标题】:Where to add headers to a POST request in angular5?在 Angular 5 中将标头添加到 POST 请求的位置?
【发布时间】:2023-03-03 03:11:01
【问题描述】:

我正在尝试上传一张图片并向 spring rest 控制器发送一个 post 请求,以便它可以保存它。

我正在使用 jwt,所以我需要在 POST 请求中传递 JWT 标头。

这是 UploadFile.service.ts

pushFileToStorage(file: File): Observable<HttpEvent<{}>> {

    if(this.authService.getToken()==null) {
      this.authService.loadToken();
    }
    const formdata: FormData = new FormData();

    formdata.append('file', file);

    const req = new HttpRequest('POST', this.host+'/post', {
  reportProgress: true,
  responseType: 'text'
});

    return this.http.request(req);
  }

我想知道我可以在哪里添加标题:

{headers:new HttpHeaders({'Authorization':this.authService.getToken()})} 

在发布请求中,我尝试将其添加到 {reportProgres ..} 后面,但它似乎不正确,因为我收到有关标题的错误。

有什么想法吗?

这是我正在尝试的,但它就像'init'而不是选项:

我正在使用 HTTPCLIENT

【问题讨论】:

    标签: angular angular5 frontend


    【解决方案1】:

    如果需要频繁设置header,可以使用interceptors

    @Injectable()
    export class TokenInterceptor implements HttpInterceptor {
    
        constructor(private authService: AuthService) { }
    
        intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
            const req = r.clone({
                headers: r.headers.set('Authorization', this.authService.getToken()),
                body: req.body
            });
            return next.handle(req);
        }
    }
    
    export const tokenInterceptorProvider = {
        provide: HTTP_INTERCEPTORS,
        useClass: TokenInterceptor,
        multi: true
    };
    

    将其添加到模块的providers

    @NgModule({
         providers: [tokenInterceptorProvider]
    })
    

    【讨论】:

    • 好吧,我试试这个
    【解决方案2】:
    constructor(private http: Http) { }
      let neededHeaders = new HttpHeaders(); 
      neededHeaders.append('Authorization', this.authService.getToken());
      const req = this.http.post(this.host+'/post', body, {headers: neededHeaders, reportProgress: true, responseType: 'text'});
    

    From the documentation

    post(url: string, body: any | null, options: {
      headers?: HttpHeaders | {
            [header: string]: string | string[];
        };
       reportProgress?: boolean;
       responseType: 'text';
    });
    

    【讨论】:

    • 但是 {reportProgress: true, responseType: 'text' } 呢?
    • 我和你做的一样,但还不正确,你能再看看我的帖子吗
    • 您是否导入了 RequestOptions?将标头传递给 RequestOptions(),然后将该选项传递给您的 post req
    • 没有,因为我确实在 { reportProgress: true, responseType: 'text' } 之后直接添加了标题,如您的示例所示
    • 没有 HTTP Post 期望选项,我们直接传递标头,这不应该是这种情况。就像this.http.post(url, body, options);。因此,创建选项将标头传递给它并使用我在示例中提到的 RequestOptions。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2019-01-10
    • 2021-04-16
    相关资源
    最近更新 更多