【问题标题】:Handling json error messages in blob http calls处理 blob http 调用中的 json 错误消息
【发布时间】:2018-01-10 16:16:09
【问题描述】:

我们有如下 http 调用:

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

它返回我们通过 FileSaver 进一步保存的 blob pdf。

问题是服务器是否返回 4XX 响应,其中包含一些 application/json 和正文中的消息。在这种情况下,我们无法找到访问它的方法,因为responseType 必须在请求之前设置,并且以后不能更改。

有什么优雅的解决方案吗?

【问题讨论】:

  • 您获得了哪些特定代码? en.wikipedia.org/wiki/…
  • 我希望任何 4xx 响应都具有相同的行为(接收带有错误消息的 json)。为了讨论,假设服务器返回 400 和 {errorCode:1, errorMessage:"do something"}
  • 例如身份验证失败和超时将有完全不同的解决方案。所以请求太开放了...
  • 好的,让我们坚持使用 400 响应代码。
  • 对于 400 angular.io/api/http/Response#statusText 我会记录下来,看看该消息是否为您提供了更多信息。不确定这是否会给您带来比错误请求更多的信息。告诉我

标签: angular


【解决方案1】:

我做了一些测试,这就是我到目前为止所做的。它工作正常,一切都符合预期。但我不会接受它作为答案,而是留一段时间让社区审查。如果有人发现这种方法存在问题,请在 cmets 中指出。

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));
          })
      });
  }

【讨论】:

  • 我可以为最新的 RxJs 添加更新版本的 sn-p 吗?顺便说一句,Angular 团队似乎对请求的功能不感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多