在收到响应后,以angular(5)更改responseType

问题描述 投票:1回答:1

有没有办法在接收响应后更改post方法(角度5)的响应类型? 问题:当响应没问题时,我需要responseType为blob。如果不是 - 我需要json responseType。 我做了一些谷歌搜索,但无法找到完全适合我的情况的答案。 代码示例(简要):

// just simple method in service

export class MyService {

  constructor(private http: HttpClient) {}

  doSomething(data, fileName): Observable<any> {
    return this.http.post('url', data, {
      headers: new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded'),
      params: new HttpParams().set('fileName', fileName),
      responseType: 'blob'
    })
  }
}

// just classic method in component

export class MyComponent {

  constructor(private myService: MyService) {}

  this.myService.doSomething(this.data, this.file).subscribe(() => {
    // here doing something useful
  }, (error: HttpErrorResponse) => {
    // handling the error
  })
}

所以,还有一次,在这种情况下,每当我得到blob的响应时,如果一切都很好就很好。但如果我有错误,我需要回应在json。反之亦然。 如何在两种情况下设置正确的responseType?提前致谢。

javascript json angular blob response
1个回答
2
投票

我相信你可以这样做:

 this.http.post('url', data, 
  { 
    observe: 'response',
    responseType: 'arraybuffer' ,
    headers: new HttpHeaders().set('Accept', 'application/octet-stream; application/json'), 
    params: new HttpParams().set('fileName', '') 
  })
  .pipe(
    map(res => {
      if (res.ok) {
        const blob:Blob = new Blob([res.body], {type: 'application/octet-stream'});
        return blob;
      }
      else {
        var decodedString = String.fromCharCode.apply(null, new Uint8Array(res.body));
        var obj = JSON.parse(decodedString);

        return obj;
      }
    })
  );
© www.soinside.com 2019 - 2024. All rights reserved.