I am implementing a file upload service with Angular 5 and I want to give the user some feedback on the upload progress. I found several pages suggesting to use the reportProgress
parameter that comes with Angulars HttpClient
, but I cannot get it working.
I use a wrapper class for all my http-requests, which then does some logic and finally all requests end up in the same method that's being called:
public request(request: HttpRequest<any>, options?: any): Observable<any> {
return this.httpClient.request(request.method, request.url, {
body: request.body,
headers: request.headers,
responseType: request.responseType,
...options
});
}
I then pass a upload (post) call to it, with { reportProgress: true }
as options
. This did not work at all, nothing on the request changed. So I suspected, that I actually need to use the reportProgress
-parameter in the HttpRequest constructor to make it work and changed my code accordingly:
public request(request: HttpRequest<any>, options?: any): Observable<any> {
return this.httpClient.request(
new HttpRequest(request.method, request.url, request.body, {
headers: request.headers,
responseType: request.responseType,
...options
})
);
}
This leads to the even more weird behavior, that now no matter what my options look like, I always only receive {type: 0}
as response from the request.
What am I overseeing? I use Angular 5.1.1 and I am really a bit puzzled here right now.
So to give an explicit example, right now I receive the same response for those two HttpRequests:
{
"url":"http://127.0.0.1:8888/test",
"body":{
"data":"testdata"
},
"reportProgress":false,
"withCredentials":false,
"responseType":"json",
"method":"POST",
"headers":{ some-headers ... }
}
and this request:
{
"url":"http://127.0.0.1:8888/api/pages",
"body":{
"pageUrl":"http://localhost:1234/"
},
"reportProgress":true,
"withCredentials":false,
"responseType":"json",
"method":"POST",
"headers":{ some-headers ... }
}
.clone
method is probably a better way to create a new request based on an existing one. – Weigela.clone()
-method, but wanted a generic approach, where I do not have to check for single properties in the option-object. – Polite