Saltar al contenido

Angular (5) httpclient observe y responseType: ‘blob’

Solución:

Cuando usas observe:response, no escribas la llamadapost<Blob>(...)), ya que el Observable devuelto será de HttpResponse. Entonces esto debería funcionar:

this.httpclient.post('MyBackendUrl', 
    params,
    {observe: 'response', responseType: 'blob'}
);

Por qué sucede esto, hay dos versiones del método de publicación, una con un tipo genérico y otra sin:

/**
     * Construct a POST request which interprets the body as JSON and returns the full event stream.
     *
     * @return an `Observable` of all `HttpEvent`s for the request, with a body type of `T`.
     */
    post<T>(url: string, body: any | null, options: {
        headers?: HttpHeaders | {
            [header: string]: string | string[];
        };
        observe: 'events';
        params?: HttpParams | {
            [param: string]: string | string[];
        };
        reportProgress?: boolean;
        responseType?: 'json';
        withCredentials?: boolean;
    }): Observable<HttpEvent<T>>;
    /**
     * Construct a POST request which interprets the body as an `ArrayBuffer` and returns the full response.
     *
     * @return an `Observable` of the `HttpResponse` for the request, with a body type of `ArrayBuffer`.
     */
    post(url: string, body: any | null, options: {
        headers?: HttpHeaders | {
            [header: string]: string | string[];
        };
        observe: 'response';
        params?: HttpParams | {
            [param: string]: string | string[];
        };
        reportProgress?: boolean;
        responseType: 'arraybuffer';
        withCredentials?: boolean;
    }): Observable<HttpResponse<ArrayBuffer>>;

puedes usar como me gusta

responseType: 'blob' as 'json'

Otras respuestas son correctas pero les falta el ejemplo.

La respuesta principal Primero, cuando se establece responseType, el tipo de retorno de la respuesta se cambia a Blob. Para resolver este complemento observe: 'response' que devuelve HTTPResponse.

Ejemplo:
Me encontré con este problema y pasé 6 horas resolviéndolo.

Entonces, aquí presento un ejemplo para obtener el nombre de archivo de los encabezados y descargar el archivo:

downloadPDF(url: string): Observable<any> {
return this.http.get<any>(url, { responseType: 'blob', observe: 'response' }).pipe(
  map((result:HttpResponse<Blob>) => {
    console.log(result);
    saveAs(result, "Quotation.pdf");
    return result;
  }));

Aquí el http es una instancia de HttpClient, saveAs() es un método del paquete FileSaver npm igual que el OP.

Hay un problema más: es posible que obtenga solo 5 encabezados (Cache-Control, Pragma, etc.) en result.headers y no su encabezado personalizado para, por ejemplo, x-filename.

La razón detrás de este CORS. Básicamente, CORS no permite que los navegadores accedan a más de un puñado de encabezados (enumerados en el enlace anterior).

Entonces, resuelve esto, tendrías que cambiar el servidor / API para enviar Access-Control-Expose-Headers encabezado con la solicitud.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *