Browse Source
Merge pull request #15491 from abpframework/issue/15380
Add HttpContext variable and skip it http interceptor logic when it i…
pull/15495/head
Muhammed Altuğ
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with
56 additions and
5 deletions
docs/en/UI/Angular/HTTP-Requests.md
npm/ng-packs/packages/core/src/lib/clients/http.client.ts
npm/ng-packs/packages/core/src/lib/clients/index.ts
npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts
npm/ng-packs/packages/core/src/lib/tokens/http-context.token.ts
npm/ng-packs/packages/core/src/lib/tokens/index.ts
npm/ng-packs/packages/core/src/public-api.ts
@ -298,3 +298,15 @@ export function handleHttpErrors(injector: Injector, httpError: HttpErrorRespons
return throwError(httpError)
return throwError(httpError)
}
}
```
```
### How to Skip HTTP interceptors and ABP headers
The ABP Framework adds several HTTP headers to the HttpClient, such as the "Auth token" or "tenant Id".
The ABP Server must possess the information but the ABP user may not want to send this informations to an external server.
ExternalHttpClient and IS EXTERNAL REQUEST HttpContext Token were added in V6.0.4.
The ABP Http interceptors check the value of the `IS_EXTERNAL_REQUEST` token. If the token is True then ABP-specific headers won't be added to Http Request.
The `ExternalHttpClient` extends from `HTTPClient` and sets the `IS_EXTERNAL_REQUEST` context token to true.
When you are using `ExternalHttpClient` as HttpClient in your components, it does not add ABP-specific headers.
Note: With `IS_EXTERNAL_REQUEST` or without it, ABP loading service works.
@ -0,0 +1,30 @@
import { HttpClient , HttpContext , HttpRequest } from '@angular/common/http' ;
import { Injectable } from '@angular/core' ;
import { Observable } from 'rxjs' ;
import { IS_EXTERNAL_REQUEST } from '../tokens/http-context.token' ;
// source : https://github.com/armanozak/demo-angular-server-specific-interceptors
@Injectable ( {
providedIn : 'root' ,
} )
export class ExternalHttpClient extends HttpClient {
override request (
first : string | HttpRequest < any > ,
url? : string ,
options : RequestOptions = { } ,
) : Observable < any > {
if ( typeof first === 'string' ) {
this . # setPlaceholderContext ( options ) ;
return super . request ( first , url , options ) ;
}
this . # setPlaceholderContext ( first ) ;
return super . request ( first ) ;
}
# setPlaceholderContext ( optionsOrRequest : { context? : HttpContext } ) {
optionsOrRequest . context ? ? = new HttpContext ( ) ;
optionsOrRequest . context . set ( IS_EXTERNAL_REQUEST , true ) ;
}
}
type RequestOptions = Parameters < HttpClient [ ' request ' ] > [ 2 ] ;
@ -0,0 +1 @@
export * from './http.client' ;
@ -5,6 +5,7 @@ import { finalize } from 'rxjs/operators';
import { SessionStateService } from '../services/session-state.service' ;
import { SessionStateService } from '../services/session-state.service' ;
import { HttpWaitService } from '../services/http-wait.service' ;
import { HttpWaitService } from '../services/http-wait.service' ;
import { TENANT_KEY } from '../tokens/tenant-key.token' ;
import { TENANT_KEY } from '../tokens/tenant-key.token' ;
import { IS_EXTERNAL_REQUEST } from '../tokens/http-context.token' ;
@Injectable ( {
@Injectable ( {
providedIn : 'root' ,
providedIn : 'root' ,
@ -19,12 +20,14 @@ export class ApiInterceptor implements HttpInterceptor {
intercept ( request : HttpRequest < any > , next : HttpHandler ) {
intercept ( request : HttpRequest < any > , next : HttpHandler ) {
this . httpWaitService . addRequest ( request ) ;
this . httpWaitService . addRequest ( request ) ;
return next
const isExternalRequest = request . context ? . get ( IS_EXTERNAL_REQUEST ) ;
. handle (
const newRequest = isExternalRequest
request . clone ( {
? request
: request . clone ( {
setHeaders : this.getAdditionalHeaders ( request . headers ) ,
setHeaders : this.getAdditionalHeaders ( request . headers ) ,
} ) ,
} ) ;
)
return next
. handle ( newRequest )
. pipe ( finalize ( ( ) = > this . httpWaitService . deleteRequest ( request ) ) ) ;
. pipe ( finalize ( ( ) = > this . httpWaitService . deleteRequest ( request ) ) ) ;
}
}
@ -0,0 +1,3 @@
import { HttpContextToken } from '@angular/common/http' ;
export const IS_EXTERNAL_REQUEST = new HttpContextToken < boolean > ( ( ) = > false ) ;
@ -7,3 +7,4 @@ export * from './manage-profile.token';
export * from './options.token' ;
export * from './options.token' ;
export * from './queue.token' ;
export * from './queue.token' ;
export * from './tenant-key.token' ;
export * from './tenant-key.token' ;
export * from './http-context.token' ;
@ -23,3 +23,4 @@ export * from './lib/strategies';
export * from './lib/tokens' ;
export * from './lib/tokens' ;
export * from './lib/utils' ;
export * from './lib/utils' ;
export * from './lib/validators' ;
export * from './lib/validators' ;
export * from './lib/clients' ;