Contexte: j'essaie de télécharger un fichier binaire à partir d'un backend (qui nécessite des données postées sous le nom json-body) et de l'enregistrer avec fichier-économiseur en utilisant le nom de fichier spécifié par le backend dans l'en-tête content-disposition. Pour accéder aux en-têtes, je pense avoir besoin de HttpResponse.
Mais je ne peux pas utiliser la méthode HttpClient.post<T>(...): Observable<HttpResponse<T>>;
d'angular avec un blob.
Quand j'appelle
this.httpclient.post<Blob>('MyBackendUrl',
params,
{observe: 'response', responseType: 'blob'});
the compiler complains about the 'blob' ('json' is accepted by the compiler):
error TS2345: Argument of type '{ observe: "response"; responseType: "blob"; }' is not assignable to parameter of type '{ headers?: HttpHeaders | { [header: string]: string | string[]; }; observe?: "body"; params?: Ht...'.
Types of property 'observe' are incompatible.
Type '"response"' is not assignable to type '"body"'.
Quand je mets les options dans un propre objet comme on le voit dans https://stackoverflow.com/a/48016652/2131459 (mais sans le "comme" ...), le post (...) : Observable est appelé et je ne peux pas accéder aux en-têtes.
Btw, même le simple exemple return this.http.get<Blob>('backendUrl', {responseType: 'blob'});
comme vu par exemple. dans https://stackoverflow.com/a/46882407/2131459 ne fonctionne pas pour moi.
Versions utilisées
Lorsque vous utilisez observe:response
, Ne tapez pas l'appel (post<Blob>(...)
), car l'observable renvoyé sera de HttpResponse. Donc, cela devrait fonctionner:
this.httpclient.post('MyBackendUrl',
params,
{observe: 'response', responseType: 'blob'}
);
Pourquoi cela se produit, est qu'il existe deux versions de la méthode post, une avec un type générique, une sans:
/**
* 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>>;
vous pouvez utiliser comme
responseType: 'blob' as 'json'