【问题标题】:Handle errors with reponseType Blob Angular 4使用 reponseType Blob Angular 4 处理错误
【发布时间】:2017-09-25 17:37:11
【问题描述】:

当我需要处理来自 pdf http 请求的错误时,我遇到了错误。 这是我生成pdf的服务方法(实名已更改):

generateSomePdf(obj: any): Observable<any> {
  const headers = new Headers();
  const options = new RequestOptions();
  const url = 'http://localhost:8080/api/v1/pdf/print';

  headers.append('Content-Type', 'application/json')
  headers.append('Accept', 'application/pdf');
  options.headers = headers;

  return this.http.post(url, obj, {responseType: ResponseContentType.Blob})
    .map(res => {
      let blob = new Blob([res.blob()], {type: 'application/pdf'});
      return blob;
    })
    .catch(this.handleError);
}

错误的句柄是这样的:

handleError(error: Response | any) {
  let errMsg: string;

  if (error instanceof Response) {
    const body = error.json() || '';
    let err;

    if (body.errors != null) {
      err = body.errors || JSON.stringify(body);
    } else {
      err = body.error || JSON.stringify(body);
    }

    errMsg = `${err}`;
    console.error(`${error.status} - ${error.statusText || ''} ${err}`);
  } else {
    errMsg = error.message ? error.message : error.toString();
  }
  console.error(errMsg);
  return Observable.throw(errMsg);
}

因此,当我收到这篇文章的后端响应时,pdf 可以正常工作,但是当我收到一些错误时,来自 Angular 的处理程序会获取 Blob,而不是从后端返回的 json。那么我该如何处理呢?

当我没有设置 responseType 时,错误可以正常工作,但不会生成 pdf。

【问题讨论】:

    标签: angular http rxjs


    【解决方案1】:
    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));
              })
          });
      }
    

    【讨论】:

    • 你能解释一下你的答案吗?只留下一些代码可能没有那么有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2019-04-12
    • 2018-08-31
    • 2013-12-08
    • 2012-10-04
    相关资源
    最近更新 更多