I'm having trouble writing an angular http interceptor in plain TypeScript. The code I'm trying to convert is the following:
.config(['$httpProvider', function ($httpProvider) {
var interceptor = ['$rootScope', '$q', 'httpBuffer', function ($rootScope, $q, httpBuffer) {
function success(response) {
return response;
}
function error(response) {
if (response.status === 401 && !response.config.ignoreAuthModule) {
var deferred = $q.defer();
httpBuffer.append(response.config, deferred);
$rootScope.$broadcast('event:auth-loginRequired', response);
return deferred.promise;
}
// otherwise, default behaviour
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
};
}];
$httpProvider.responseInterceptors.push(interceptor);
}])
The first parts are clear, write a class with a constructor that takes the three dependencies $rootScope
, $q
and httpBuffer
. Also write two private methods success
and response
.
class MyInterceptorClass {
constructor(private $rootScope: ng.IRootScopeService, private $q: ng.IQService, private httpBuffer: HttpBuffer) {
}
private success(response: ng.IHttpPromiseCallbackArg<any>): ng.IHttpPromiseCallbackArg<any> {
return response;
}
private error(response: ng.IHttpPromiseCallbackArg<any>): ng.IHttpPromiseCallbackArg<any> {
if (response.status == 401 && !((<any>response.config).ignoreAuthModule)) {
var deferred = this.$q.defer();
this.httpBuffer.append(response.config, deferred);
this.$rootScope.$broadcast('event:auth-loginRequired', response);
return deferred.promise;
}
// Otherwise, default behavior
return this.$q.reject(response);
}
}
Also the registration of the interceptor should be clear:
.config(['$httpProvider', ($httpProvider: ng.IHttpProvider)=> {
$httpProvider.responseInterceptors.push(['$rootScope', '$q', 'httpBuffer', MyInterceptorClass]);
}]);
What I am having trouble with is the last part of the original JavaScript, the return value of an anonymous function. How would I create this in TypeScript? As far as I understood this would be a nameless method in TypeScript, but this is not possible.
The config settings are as follows
.config(['$httpProvider', function ($httpProvider: ng.IHttpProvider) {
$httpProvider.interceptors.push(AuthenticationInterceptor.Factory);
}])
and your actual class should look as follows
module Common.Security {
'use strict';
export class AuthenticationInterceptor {
public static Factory($q: ng.IQService) {
return new AuthenticationInterceptor($q);
}
constructor(private $q: ng.IQService) {
}
//Method name should be exactly "response" - http://docs.angularjs.org/api/ng/service/$http
public response(response) {
console.log(response);
return response || this.$q.when(response);
}
public responseError(rejection) {
console.log(rejection.status);
if (rejection.status === 401) {
}
// Otherwise, default behavior
return this.$q.reject(rejection);
}
}
this is how i write httpinterceptor as a class
module services {
export class ErrorHttpInterceptor {
public $log:ng.ILogService;
public $injector:ng.auto.IInjectorService;
public responseError = (_rejection)=>{
//handle error here
};
public request = (config)=>{
config.withCredentials = true;
return config;
};
public requestError = (rejection)=>{
var $q:ng.IQService = this.$injector.get("$q");
this.$log.log("requestError", rejection);
return $q.reject(rejection);
};
static $inject = ['$injector', '$rootScope', '$q', '$window'];
constructor($injector:ng.auto.IInjectorService, public $rootScope, public $q, public $window){
this.$log = $injector.get('$log');
this.$injector = $injector;
}
}
}
to register
var app =angular.module('foo',[]);
app.config(['$httpProvider', (_$httpProvider:ng.IHttpProvider)=>{
_$httpProvider.interceptors.push('ErrorHttpInterceptor');
}]);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With