У меня есть следующий код:
// in a service
downloadCSV(): Observable<Blob> {
return this.httpClient.get(`${apiUrl}/a.csv`, {responseType: 'blob'});
}
// in component
onDownloadClicked(event: MouseEvent) {
this.downloading = true;
this.service.downloadCSV()
.pipe(finalize(() => this.downloading = false))
.subscribe(
(data: Blob) => {
console.log(data);
},
(error) => {
console.error(error);
alert('Sorry, something wet wrong. Try again.');
},
() => {
console.log('completed!');
}
);
}
Данные записаны правильно, но 'завершено!' не зарегистрировано и финализация никогда не вызывается.
Edit:
Так что при дальнейшем исследовании кажется, что проблема связана с перехватчиком, который добавляет заголовок аутентификации.
Если перехватчик обойден (и аутентификация отключена на сервере), наблюдаемое завершается без ошибок.
Хотя я не понимаю, почему это происходит. Возможно, что-то связано с тем, что запрос клонирован?
//interceptor code
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let scope: string;
// only inject tokens for the following scopes
if (req.url.indexOf('https://graph.microsoft.com') === 0) {
scope = 'https://graph.microsoft.com';
}
else if (req.url.indexOf('https://management.azure.com') === 0) {
scope = 'https://management.azure.com';
}
else if (req.url.indexOf(environment.apiUrl) === 0) {
scope = environment.appId;
}
if (scope) {
return this.authService.getToken(scope).pipe(
switchMap((token) => {
let newReq;
if (token) {
const JWT = `Bearer ${token}`;
newReq = req.clone({
setHeaders: {
Authorization: JWT,
}
});
}
return next.handle(newReq || req);
})
);
}
else {
return next.handle(req);
}
}