簡體   English   中英

無法從 Angular HTTP 攔截器獲取請求標頭值

[英]Can't get request headers values from Angular HTTP interceptor

在 Angular 應用程序中,我使用攔截器將令牌(在需要時)注入到請求標頭中。 我還需要它將Content-Type標頭修改為適當的標頭。 默認情況下,它必須是application/json ,但是有一個調用需要上傳一個 ZIP 文件,所以我想讓Content-Type標頭保持原樣(對於這些情況,它類似於: Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryvamnUWepE840OEuq )。 我使用這個代碼:

    intercept (req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        let usr = this.userService.getActualUser();
        let confirmationToken = '';
        let credentials = false;
        let contentType = 'application/json';
        
        // Check if the incoming request has an specific content type header
        if (req.headers.has('Content-Type')) {
          contentType = req.headers.get('Content-Type');
        }
    
        // ETC
    }

問題是req.headers.has('Content-Type')總是返回false ,所以我設置了錯誤的類型並且調用失敗。 我究竟做錯了什么?

提前致謝!

我相信您的表單內容是 FormData 對象的一個​​實例? 如果是這樣的話,

if(req.body instanceof FormData)

如果您無法訪問標題,此檢查可能會幫助您或給您一些提示。 或者,您甚至可以更深入地檢查req.body對象以進行更具體的檢查。

在您的請求期間,您希望看到content-type但除非您直接指定它,否則您不會看到。

如果您有此要求,您將看到內容類型。

return this.http.get(this.ENDPOINT, {
      headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
})

然而,這可能是一種矯枉過正。

另一種可能的解決方案是檢查正文的實例類型,然后相應地設置標題

if (req.body instanceof FormData) {
    contentType = 'multipart/form-data';
}

按照您的建議,我想出了一個非常簡單的解決方案,即保留Content-Type標頭,就好像請求正文是表單數據一樣,其余的設置為 JSON。 就像是:

    if(!(req.body instanceof FormData)) {
      contentType = 'application/json';
    }

干杯!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM