2017-08-03 84 views
0

我們有HTTP調用,如:處理JSON的錯誤消息稱

this.http.get(`${environment.baseUrl}/api/v.1/reports/...`, 
{ responseType: ResponseContentType.Blob }) 

返回BLOB的PDF文件,我們通過FileSaver進一步保存。

問題是如果服務器返回4xx響應與一些application/json和正文中的消息。在這種情況下,我們無法找到如何訪問它的方法,因爲responseType必須在請求之前設置,並且以後不能更改。

有沒有優雅的解決方案呢?

+0

特定代碼(S)你得到哪些? https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_errors – JGFMK

+0

我想要任何4xx響應的相同行爲(接收帶有錯誤消息的json)。爲了討論起見,讓我們說服務器返回400與'{errorCode:1,errorMessage:「做點什麼」} –

+0

身份驗證失敗和超時例如將有完全不同的解決方案..所以請求太開放... – JGFMK

回答

0

我做了一些測試,這是我到目前爲止所做的。它的工作原理與預期一致。但我不會接受它作爲答案,但留出一段時間讓社區審查。如果有人發現這種方法存在問題,請在評論中指出。

的ErrorMessage是簡單的格式:

{ message:string }

服務:

getPDF() { 
    return this.http.get(`${environment.baseUrl}/api/v.1/reports/...`, { responseType: ResponseContentType.Blob }) 
     .map((res) => { 
     return { 
      blob: new Blob([res.blob()], { type: 'application/pdf' }), filename: this.parseFilename(res) 
     } 
     }) 
     .catch((res) => { 
     let fileAsTextObservable = new Observable<string>(observer => { 
      const reader = new FileReader(); 
      reader.onload = (e) => { 
      let responseText = (<any>e.target).result; 

      observer.next(responseText); 
      observer.complete(); 
      } 
      const errMsg = reader.readAsText(res.blob(), 'utf-8'); 
     }); 

     return fileAsTextObservable 
      .switchMap(errMsgJsonAsText => { 
      return Observable.throw(JSON.parse(errMsgJsonAsText)); 
      }) 
     }); 
    }