Как переписать xhrbackend (xhrconection) на httpxhrbackend или httpinterceptor
У меня возникли проблемы с переключением с XHRBackend и XHRConnection (Angular 4.3) на Angular 11. Не совсем понятно каким образом нужно использовать HttpInterceptor и/или HttpXhrBackend в данном случае.
custom.http.ts
export class CustomXHRBackend extends XHRBackend {
constructor(private browserXHR: BrowserXhr,
private baseResponseOptions: ResponseOptions, private xsrfStrategy: XSRFStrategy, private eventsService: EventsService) {
super(browserXHR, baseResponseOptions, xsrfStrategy);
}
createConnection(request: Request) {
this.xsrfStrategy.configureRequest(request);
let conn = new CustomXHRConnection(request, this.browserXHR, this.baseResponseOptions, this.eventsService);
return conn;
}
}
@Injectable()
export class CustomXHRConnection extends XHRConnection {
// ... get response url
setDetectedContentType(req, _xhr) {
super.setDetectedContentType(req, _xhr);
}
//--only for _xhr.upload.onprogress
constructor(req: Request, browserXHR: BrowserXhr, baseResponseOptions: ResponseOptions, private eventsService: EventsService) {
super(req, browserXHR, baseResponseOptions);
let _setDetectedContentType = super.setDetectedContentType;
let _self = this;
this.response = new Observable(function (responseObserver) {
var _xhr = browserXHR.build();
// ... _xhr.open(...)
var onLoad = function () {
// ... some operations
response.ok = (status >= 200 && status < 300);
if (response.ok) {
responseObserver.next(<any>response);
responseObserver.complete();
return;
}
responseObserver.error(response);
};
// error event handler
var onError = function (err) {
// ... some operations
}
responseObserver.error(new Response(responseOptions));
};
_setDetectedContentType(req, _xhr);
// ... set _xhr.headers and _xhr_type
_xhr.addEventListener('load', onLoad);
_xhr.addEventListener('error', onError);
_xhr.send(req.getBody());
return function() {
_xhr.removeEventListener('load', onLoad);
_xhr.removeEventListener('error', onError);
_xhr.abort();
};
});
}
}
Далее подключение XhrBackend в app.module
app.module.ts
export function _customXHRBackend(browserXHR: BrowserXhr, baseResponseOptions: ResponseOptions, xsrfStrategy: XSRFStrategy, eventsService: EventsService): XHRBackend {
return new CustomXHRBackend(browserXHR, baseResponseOptions, xsrfStrategy, eventsService);
};
@NgModule({
imports: [],
providers: [
{
provide: XHRBackend,
useFactory: _customXHRBackend,
deps: [BrowserXhr, ResponseOptions, XSRFStrategy, EventsService]
},
],
bootstrap: [MainApp]
})
export class AppModule {
}