2017-10-16 38 views
-2

假設我們在角4 HttpClient基於應用程序執行的響應攔截:修改其有效載荷前克隆一個響應?

export class MyInterceptor implements HttpInterceptor { 
    public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     return next.handle(req).map((event: HttpEvent<any>) => { 
      if (!(event instanceof HttpResponse)) 
       return event; 

      // Modify event.body somehow like: event.body.items = { ... }; - do we need to do event.clone() before? 
     }); 
    } 
} 

我們知道,如果我們正在執行的請求攔截器,我們必須clone()req保持其不變性。

但是,我們需要clone()修改通過body屬性暴露它的有效載荷之前的反應如何?

+0

試試看吧?或者做研究:[文檔](https://angular.io/guide/http#immutability)提及請求和響應的不變性;和['HttpResponse'](https://angular.io/api/common/http/HttpResponse)暴露只讀通過get訪問一切,並提供相同的'.clone'方法。 – jonrsharpe

+0

這[發佈](https://netbasal.com/a-taste-from-the-new-angular-http-client-38fcdc6b359b)對,你應該如何使用攔截器很好的解釋。看一眼,你可能會發現它很有用。 – Mihailo

+0

@jonrsharpe:我們應該觀察什麼時候響應沒有被克隆,以防需要什麼?至於文檔,是的,他們提到了響應的不可變性,但是您提供的部分的其餘部分只針對「請求」。所以他們不清楚地說我們是否需要克隆響應。 –

回答

-1

響應攔截器是officially allowed要麼修改響應對象,要麼創建一個全新的響應對象。

攔截器存在檢查和突變傳出的請求和傳入的響應。

攔截器可以選擇變換的響應事件流中,通過在()由next.handle返回的流應用附加的Rx運算符。

所以你的問題的答案是,你不需要保持響應不變。這意味着你處於編程的美妙空間,你可以決定是否編寫一個攔截器,它可以改變響應。

如果你想改變一個只讀屬性,你必須創建一個新的反應,而不是改變你有一個。

+0

這是AngularJS文檔,而不是Angular的。 – jonrsharpe

+0

@jonrsharpe更新到角v4.4.5 – Fenton

+1

*「變換的響應事件流」 *並不一定意味着在流變異的個體響應對象,雖然。從「HttpResponse」的只讀API中可以清楚的看到它不應該被突變,IMO。 – jonrsharpe