Измените responseType в angular (5) после получения ответа - PullRequest
0 голосов
/ 11 сентября 2018

Есть ли способ изменить тип ответа в методе post (angular 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 в обеих ситуациях? Заранее спасибо.

1 Ответ

0 голосов
/ 11 сентября 2018

Я верю, что вы можете сделать это:

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