Невозможно установить responseType в пост-запросе angular 5, пытаясь захватить ответ файла из post api - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь установить responseType для arraybuffer, но он выдает ошибку.API возвращает файл, и мне нужно захватить это и сгенерировать файл.

Я вызываю exportCartDetails, как показано ниже, который запускается на отправителе события onAdd в диалоговом окне Mat.

const data1 = this.dialogRef.componentInstance.onAdd.subscribe(result => {
      this.exportCartDetails(result)
        .subscribe(
          mydata=>{
            console.log('data is all here');
            var file =new Blob([mydata],{type: 'application/vnd.ms-excel' });
            var fileURL=URL.createObjectURL(file);
            let a =document.createElement("a");
            a.style.display = "none";
            a.href=fileURL;
            a.target="_blank";
            a.download="CartData.xls";
            a.click();
            a.remove();
         }
      )
        ,
    err=>{
    alert("Error in calling api");
    console.log(err);
  };

Сведения о корзине экспорта ниже

  exportCartDetails(report_data: ReferenceDataApi): Observable<ArrayBuffer> {
    const headers=new HttpHeaders().set('Content-Type', '*' );    
    //header.set( 'Content-Disposition': 'attachment; filename=' + req.body.filename,);
    const response = new HttpResponse();
    console.log(this.report_data);
    return this.http.post<ArrayBuffer>(url,this.report_data,{headers,responseType:'arraybuffer'})
    .pipe(
      catchError(this.handleError<ArrayBuffer>('exportCartDetails'))
    );    
}

Ошибка ниже.

ERROR in src/app/cart-detail/cart-detail.component.ts(118,91): error TS2345: Argument of type '{ headers: HttpHeaders; responseType: ArrayBuffer; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: Ht...'.
  Types of property 'responseType' are incompatible.
    Type 'ArrayBuffer' is not assignable to type '"json"'.
src/app/cart-detail/cart-detail.component.ts(118,113): error TS2352: Type 'string' cannot be converted to type 'ArrayBuffer'.

1 Ответ

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

В качестве обходного пути вы можете удалить ожидаемый тип возврата <ArrayBuffer> из httpClient.post().

return this.http.post(url,this.report_data,{headers,responseType:'arraybuffer'})
    .pipe(
      catchError(this.handleError<ArrayBuffer>('exportCartDetails'))
    ); 

В качестве альтернативы вы также можете попробовать указать псевдоним для 'arraybuffer', например

responseType:'arraybuffer' as 'arraybuffer'

Существует открытый вопрос относительно this

Код:

return this.http.post<ArrayBuffer>(url,this.report_data,{headers,responseType:'arraybuffer' as 'arraybuffer'})
        .pipe(
          catchError(this.handleError<ArrayBuffer>('exportCartDetails'))
   ); 
...