navigationend - title angular 6
Angular: establezca encabezados para cada solicitud (18)
Hubo algunos cambios para angular 2.0.1 y superior:
import {RequestOptions, RequestMethod, Headers} from ''@angular/http'';
import { BrowserModule } from ''@angular/platform-browser'';
import { HttpModule } from ''@angular/http'';
import { AppRoutingModule } from ''./app.routing.module'';
import { AppComponent } from ''./app.component'';
//you can move this class to a better place
class GlobalHttpOptions extends RequestOptions {
constructor() {
super({
method: RequestMethod.Get,
headers: new Headers({
''MyHeader'': ''MyHeaderValue'',
})
});
}
}
@NgModule({
imports: [ BrowserModule, HttpModule, AppRoutingModule ],
declarations: [ AppComponent],
bootstrap: [ AppComponent ],
providers: [ { provide: RequestOptions, useClass: GlobalHttpOptions} ]
})
export class AppModule { }
Necesito configurar algunos encabezados de autorización después de que el usuario haya iniciado sesión, para cada solicitud posterior.
Para configurar encabezados para una solicitud particular,
import {Headers} from ''angular2/http'';
var headers = new Headers();
headers.append(headerName, value);
// HTTP POST using these headers
this.http.post(url, data, {
headers: headers
})
// do something with the response
Pero no sería factible establecer manualmente encabezados de solicitud para cada solicitud de esta manera.
¿Cómo configuro los encabezados una vez que el usuario ha iniciado sesión y también elimino esos encabezados al cerrar sesión?
Puedes usar
canActive
en tus rutas, así:
import { Injectable } from ''@angular/core'';
import { Router } from ''@angular/router'';
import { CanActivate } from ''@angular/router'';
import { AuthService } from ''./auth.service'';
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate() {
// If user is not logged in we''ll send them to the homepage
if (!this.auth.loggedIn()) {
this.router.navigate(['''']);
return false;
}
return true;
}
}
const appRoutes: Routes = [
{
path: '''', redirectTo: ''/deals'', pathMatch: ''full''
},
{
path: ''special'',
component: PrivateDealsComponent,
/* We''ll use the canActivate API and pass in our AuthGuard.
Now any time the /special route is hit, the AuthGuard will run
first to make sure the user is logged in before activating and
loading this route. */
canActivate: [AuthGuard]
}
];
Puedo elegir una solución más simple> Agregar nuevos encabezados a las opciones predeterminadas fusionar o cargar mediante su función api get (u otra).
get(endpoint: string, params?: any, options?: RequestOptions) {
if (!options) {
options = new RequestOptions();
options.headers = new Headers( { "Accept": "application/json" } ); <<<<
}
// [...]
}
Por supuesto, puede externalizar estos encabezados en las opciones predeterminadas o lo que sea en su clase. Esto está en la API de clase de exportación api.ts @Injectable () generada por Ionic {}
Es muy rápido y funciona para mí. No quería el formato json / ld.
¿Qué tal mantener un servicio separado como sigue?
import {Injectable} from ''@angular/core'';
import {Headers, Http, RequestOptions} from ''@angular/http'';
@Injectable()
export class HttpClientService extends RequestOptions {
constructor(private requestOptionArgs:RequestOptions) {
super();
}
addHeader(headerName: string, headerValue: string ){
(this.requestOptionArgs.headers as Headers).set(headerName, headerValue);
}
}
y cuando llame desde otro lugar, use
this.httpClientService.addHeader("Authorization", "Bearer " + this.tok);
y verá el encabezado agregado, por ejemplo: - Autorización de la siguiente manera
Ampliar
BaseRequestOptions
podría ser de gran ayuda en este escenario.
Mira el siguiente código:
import {provide} from ''angular2/core'';
import {bootstrap} from ''angular2/platform/browser'';
import {HTTP_PROVIDERS, Headers, Http, BaseRequestOptions} from ''angular2/http'';
import {AppCmp} from ''./components/app/app'';
class MyRequestOptions extends BaseRequestOptions {
constructor () {
super();
this.headers.append(''My-Custom-Header'',''MyCustomHeaderValue'');
}
}
bootstrap(AppCmp, [
ROUTER_PROVIDERS,
HTTP_PROVIDERS,
provide(RequestOptions, { useClass: MyRequestOptions })
]);
Esto debería incluir ''Mi encabezado personalizado'' en cada llamada.
Actualizar:
Para poder cambiar el encabezado en cualquier momento que desee en lugar del código anterior, también puede usar el siguiente código para agregar un nuevo encabezado:
this.http._defaultOptions.headers.append(''Authorization'', ''token'');
para eliminar puedes hacer
this.http._defaultOptions.headers.delete(''Authorization'');
También hay otra función que puede usar para establecer el valor:
this.http._defaultOptions.headers.set(''Authorization'', ''token'');
La solución anterior aún no es completamente válida en el contexto mecanografiado. _defaultHeaders está protegido y no se debe usar de esta manera. Recomendaría la solución anterior para una solución rápida, pero a largo plazo es mejor escribir su propio contenedor alrededor de las llamadas http que también maneja la autenticación. Tome el siguiente ejemplo de auth0 que es mejor y limpio.
https://github.com/auth0/angular2-jwt/blob/master/angular2-jwt.ts
Actualización: junio de 2018 , veo que muchas personas optan por esta solución, pero recomendaría lo contrario. Al agregar un encabezado global, se enviará un token de autenticación a cada llamada de API que salga de su aplicación. Por lo tanto, las llamadas de la API que se dirigen a complementos de terceros como intercom o zendesk o cualquier otra API también llevarán su encabezado de autorización. Esto podría resultar en una gran falla de seguridad. Por lo tanto, use el interceptor globalmente, pero verifique manualmente si la llamada saliente se dirige hacia el punto final de la API de su servidor o no y luego adjunte el encabezado de autenticación.
Aquí hay una versión mejorada de la respuesta aceptada, actualizada para Angular2 final:
import {Injectable} from "@angular/core";
import {Http, Headers, Response, Request, BaseRequestOptions, RequestMethod} from "@angular/http";
import {I18nService} from "../lang-picker/i18n.service";
import {Observable} from "rxjs";
@Injectable()
export class HttpClient {
constructor(private http: Http, private i18n: I18nService ) {}
get(url:string):Observable<Response> {
return this.request(url, RequestMethod.Get);
}
post(url:string, body:any) {
return this.request(url, RequestMethod.Post, body);
}
private request(url:string, method:RequestMethod, body?:any):Observable<Response>{
let headers = new Headers();
this.createAcceptLanguageHeader(headers);
let options = new BaseRequestOptions();
options.headers = headers;
options.url = url;
options.method = method;
options.body = body;
options.withCredentials = true;
let request = new Request(options);
return this.http.request(request);
}
// set the accept-language header using the value from i18n service that holds the language currently selected by the user
private createAcceptLanguageHeader(headers:Headers) {
headers.append(''Accept-Language'', this.i18n.getCurrentLang());
}
}
Por supuesto, debe extenderse para métodos como
delete
y
put
si es necesario (todavía no los necesito en este momento en mi proyecto).
La ventaja es que hay menos código duplicado en los métodos
get
/
post
/ ...
Tenga en cuenta que en mi caso uso cookies para la autenticación.
Necesitaba el encabezado para i18n (el encabezado
Accept-Language
) porque muchos valores devueltos por nuestra API se traducen al idioma del usuario.
En mi aplicación, el servicio i18n contiene el idioma seleccionado actualmente por el usuario.
Así es como lo hice para configurar el token con cada solicitud.
import { RequestOptions, BaseRequestOptions, RequestOptionsArgs } from ''@angular/http'';
export class CustomRequestOptions extends BaseRequestOptions {
constructor() {
super();
this.headers.set(''Content-Type'', ''application/json'');
}
merge(options?: RequestOptionsArgs): RequestOptions {
const token = localStorage.getItem(''token'');
const newOptions = super.merge(options);
if (token) {
newOptions.headers.set(''Authorization'', `Bearer ${token}`);
}
return newOptions;
}
}
Y regístrese en app.module.ts
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [
{ provide: RequestOptions, useClass: CustomRequestOptions }
],
bootstrap: [AppComponent]
})
export class AppModule { }
Aunque estoy respondiendo esto muy tarde, pero si alguien está buscando una solución más fácil.
Podemos usar angular2-jwt. angular2-jwt es útil para adjuntar automáticamente un token web JSON (JWT) como encabezado de autorización cuando se realizan solicitudes HTTP desde una aplicación Angular 2.
Podemos establecer encabezados globales con la opción de configuración avanzada
export function authHttpServiceFactory(http: Http, options: RequestOptions) {
return new AuthHttp(new AuthConfig({
tokenName: ''token'',
tokenGetter: (() => sessionStorage.getItem(''token'')),
globalHeaders: [{''Content-Type'':''application/json''}],
}), http, options);
}
Y enviando por solicitud token como
getThing() {
let myHeader = new Headers();
myHeader.append(''Content-Type'', ''application/json'');
this.authHttp.get(''http://example.com/api/thing'', { headers: myHeader })
.subscribe(
data => this.thing = data,
err => console.log(error),
() => console.log(''Request Complete'')
);
// Pass it after the body in a POST request
this.authHttp.post(''http://example.com/api/thing'', ''post body'', { headers: myHeader })
.subscribe(
data => this.thing = data,
err => console.log(error),
() => console.log(''Request Complete'')
);
}
Aunque estoy respondiendo muy tarde, podría ayudar a alguien más.
Para inyectar encabezados a todas las solicitudes cuando se utiliza
@NgModule
, se puede hacer lo siguiente:
(Probé esto en Angular 2.0.1)
/**
* Extending BaseRequestOptions to inject common headers to all requests.
*/
class CustomRequestOptions extends BaseRequestOptions {
constructor() {
super();
this.headers.append(''Authorization'', ''my-token'');
this.headers.append(''foo'', ''bar'');
}
}
Ahora en
@NgModule
haga lo siguiente:
@NgModule({
declarations: [FooComponent],
imports : [
// Angular modules
BrowserModule,
HttpModule, // This is required
/* other modules */
],
providers : [
{provide: LocationStrategy, useClass: HashLocationStrategy},
// This is the main part. We are telling Angular to provide an instance of
// CustomRequestOptions whenever someone injects RequestOptions
{provide: RequestOptions, useClass: CustomRequestOptions}
],
bootstrap : [AppComponent]
})
Cree una clase Http personalizada extendiendo Angular 2
Http
Provider y simplemente anule el
constructor
y el método de
request
en su clase Http personalizada.
El siguiente ejemplo agrega el encabezado de
Authorization
en cada solicitud http.
import {Injectable} from ''@angular/core'';
import {Http, XHRBackend, RequestOptions, Request, RequestOptionsArgs, Response, Headers} from ''@angular/http'';
import {Observable} from ''rxjs/Observable'';
import ''rxjs/add/operator/map'';
import ''rxjs/add/operator/catch'';
@Injectable()
export class HttpService extends Http {
constructor (backend: XHRBackend, options: RequestOptions) {
let token = localStorage.getItem(''auth_token''); // your custom token getter function here
options.headers.set(''Authorization'', `Bearer ${token}`);
super(backend, options);
}
request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
let token = localStorage.getItem(''auth_token'');
if (typeof url === ''string'') { // meaning we have to add the token to the options, not in url
if (!options) {
// let''s make option object
options = {headers: new Headers()};
}
options.headers.set(''Authorization'', `Bearer ${token}`);
} else {
// we have to add the token to the url object
url.headers.set(''Authorization'', `Bearer ${token}`);
}
return super.request(url, options).catch(this.catchAuthError(this));
}
private catchAuthError (self: HttpService) {
// we have to pass HttpService''s own instance here as `self`
return (res: Response) => {
console.log(res);
if (res.status === 401 || res.status === 403) {
// if not authenticated
console.log(res);
}
return Observable.throw(res);
};
}
}
Luego configure su
app.module.ts
principal para proporcionar
XHRBackend
como el proveedor de
ConnectionBackend
y
RequestOptions
a su clase Http personalizada:
import { HttpModule, RequestOptions, XHRBackend } from ''@angular/http'';
import { HttpService } from ''./services/http.service'';
...
@NgModule({
imports: [..],
providers: [
{
provide: HttpService,
useFactory: (backend: XHRBackend, options: RequestOptions) => {
return new HttpService(backend, options);
},
deps: [XHRBackend, RequestOptions]
}
],
bootstrap: [ AppComponent ]
})
Después de eso, ahora puede usar su proveedor http personalizado en sus servicios. Por ejemplo:
import { Injectable } from ''@angular/core'';
import {HttpService} from ''./http.service'';
@Injectable()
class UserService {
constructor (private http: HttpService) {}
// token will added automatically to get request header
getUser (id: number) {
return this.http.get(`/users/${id}`).map((res) => {
return res.json();
} );
}
}
Aquí hay una guía completa: http://adonespitogo.com/articles/angular-2-extending-http-provider/
Después de un poco de investigación, encontré la forma final y más fácil es extender
BaseRequestOptions
que prefiero.
Las siguientes son las formas en que intenté y renuncié por alguna razón:
1. extienda
BaseRequestOptions
y agregue encabezados dinámicos en
constructor()
.
No puede funcionar si inicio sesión.
Se creará una vez.
Entonces no es dinámico.
2. extender
Http
.
La misma razón que la anterior, no puedo agregar encabezados dinámicos en
constructor()
.
Y si reescribo el método
request(..)
y establezco encabezados, así:
request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
let token = localStorage.getItem(AppConstants.tokenName);
if (typeof url === ''string'') { // meaning we have to add the token to the options, not in url
if (!options) {
options = new RequestOptions({});
}
options.headers.set(''Authorization'', ''token_value'');
} else {
url.headers.set(''Authorization'', ''token_value'');
}
return super.request(url, options).catch(this.catchAuthError(this));
}
Solo necesita sobrescribir este método, pero no todos los métodos get / post / put.
3.Y mi solución preferida es extender
BaseRequestOptions
y sobrescribir
merge()
:
@Injectable()
export class AuthRequestOptions extends BaseRequestOptions {
merge(options?: RequestOptionsArgs): RequestOptions {
var newOptions = super.merge(options);
let token = localStorage.getItem(AppConstants.tokenName);
newOptions.headers.set(AppConstants.authHeaderName, token);
return newOptions;
}
}
Se llamará a esta función
merge()
para cada solicitud.
El mas simple de todos
Crear un archivo
config.ts
import { HttpHeaders } from ''@angular/common/http'';
export class Config {
url: string = ''http://localhost:3000'';
httpOptions: any = {
headers: new HttpHeaders({
''Content-Type'': ''application/json'',
''Authorization'': JSON.parse(localStorage.getItem(''currentUser'')).token
})
}
}
Luego, en su
service
, solo importe el archivo
config.ts
import { Config } from ''../config'';
import { HttpClient } from ''@angular/common/http'';
@Injectable()
export class OrganizationService {
config = new Config;
constructor(
private http: HttpClient
) { }
addData(data): Observable<any> {
let sendAddLink = `${this.config.url}/api/addData`;
return this.http.post(sendAddLink , data, this.config.httpOptions).pipe(
tap(snap => {
return snap;
})
);
}
Creo que fue el más simple y el más seguro.
En
Angular 2.1.2
me acerqué a esto extendiendo el Http angular:
import {Injectable} from "@angular/core";
import {Http, Headers, RequestOptionsArgs, Request, Response, ConnectionBackend, RequestOptions} from "@angular/http";
import {Observable} from ''rxjs/Observable'';
@Injectable()
export class HttpClient extends Http {
constructor(protected _backend: ConnectionBackend, protected _defaultOptions: RequestOptions) {
super(_backend, _defaultOptions);
}
_setCustomHeaders(options?: RequestOptionsArgs):RequestOptionsArgs{
if(!options) {
options = new RequestOptions({});
}
if(localStorage.getItem("id_token")) {
if (!options.headers) {
options.headers = new Headers();
}
options.headers.set("Authorization", localStorage.getItem("id_token"))
}
return options;
}
request(url: string|Request, options?: RequestOptionsArgs): Observable<Response> {
options = this._setCustomHeaders(options);
return super.request(url, options)
}
}
luego en mis proveedores de aplicaciones pude usar una fábrica personalizada para proporcionar ''Http''
import { RequestOptions, Http, XHRBackend} from ''@angular/http'';
import {HttpClient} from ''./httpClient'';
import { RequestOptions, Http, XHRBackend} from ''@angular/http'';
import {HttpClient} from ''./httpClient'';//above snippet
function httpClientFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http {
return new HttpClient(xhrBackend, requestOptions);
}
@NgModule({
imports:[
FormsModule,
BrowserModule,
],
declarations: APP_DECLARATIONS,
bootstrap:[AppComponent],
providers:[
{ provide: Http, useFactory: httpClientFactory, deps: [XHRBackend, RequestOptions]}
],
})
export class AppModule {
constructor(){
}
}
ahora no necesito declarar todos los métodos Http y puedo usar
http
como normal en toda mi aplicación.
Los interceptores HTTP
ahora
están
disponibles a
través del nuevo
HttpClient
desde
@angular/common/http
, a
partir de las versiones Angular 4.3.x y posteriores
.
Es bastante simple agregar un encabezado para cada solicitud ahora:
import {
HttpEvent,
HttpInterceptor,
HttpHandler,
HttpRequest,
} from ''@angular/common/http'';
import { Observable } from ''rxjs'';
export class AddHeaderInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Clone the request to add the new header
const clonedRequest = req.clone({ headers: req.headers.set(''Authorization'', ''Bearer 123'') });
// Pass the cloned request instead of the original request to the next handle
return next.handle(clonedRequest);
}
}
Hay un principio de inmutabilidad , esa es la razón por la que la solicitud debe clonarse antes de configurar algo nuevo en ella.
Como editar encabezados es una tarea muy común, en realidad hay un atajo para ello (al clonar la solicitud):
const clonedRequest = req.clone({ setHeaders: { Authorization: ''Bearer 123'' } });
Después de crear el interceptor, debe registrarlo utilizando el
HTTP_INTERCEPTORS
proporcionar.
import { HTTP_INTERCEPTORS } from ''@angular/common/http'';
@NgModule({
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: AddHeaderInterceptor,
multi: true,
}],
})
export class AppModule {}
Más vale tarde que nunca ... =)
Puede tomar el concepto de
BaseRequestOptions
extendida (desde aquí
https://angular.io/docs/ts/latest/guide/server-communication.html#!#override-default-request-options
) y actualizar los encabezados "en el volar "(no solo en constructor).
Puede usar la anulación de la propiedad "encabezados" getter / setter de esta manera:
import { Injectable } from ''@angular/core'';
import { BaseRequestOptions, RequestOptions, Headers } from ''@angular/http'';
@Injectable()
export class DefaultRequestOptions extends BaseRequestOptions {
private superHeaders: Headers;
get headers() {
// Set the default ''Content-Type'' header
this.superHeaders.set(''Content-Type'', ''application/json'');
const token = localStorage.getItem(''authToken'');
if(token) {
this.superHeaders.set(''Authorization'', `Bearer ${token}`);
} else {
this.superHeaders.delete(''Authorization'');
}
return this.superHeaders;
}
set headers(headers: Headers) {
this.superHeaders = headers;
}
constructor() {
super();
}
}
export const requestOptionsProvider = { provide: RequestOptions, useClass: DefaultRequestOptions };
Me gusta la idea de anular las opciones predeterminadas, esto parece una buena solución.
Sin embargo, si está dispuesto a extender la clase
Http
.
¡Asegúrate de leer esto!
Algunas respuestas aquí en realidad muestran una sobrecarga incorrecta del método
request()
, lo que podría conducir a errores difíciles de detectar y un comportamiento extraño.
Me he topado con esto yo mismo.
Esta solución se basa en la implementación del método
request()
en Angular
4.2.x
, pero debe ser compatible con el futuro:
import {Observable} from ''rxjs/Observable'';
import {Injectable} from ''@angular/core'';
import {
ConnectionBackend, Headers,
Http as NgHttp,
Request,
RequestOptions,
RequestOptionsArgs,
Response,
XHRBackend
} from ''@angular/http'';
import {AuthenticationStateService} from ''../authentication/authentication-state.service'';
@Injectable()
export class Http extends NgHttp {
constructor (
backend: ConnectionBackend,
defaultOptions: RequestOptions,
private authenticationStateService: AuthenticationStateService
) {
super(backend, defaultOptions);
}
request (url: string | Request, options?: RequestOptionsArgs): Observable<Response> {
if (''string'' === typeof url) {
url = this.rewriteUrl(url);
options = (options || new RequestOptions());
options.headers = this.updateHeaders(options.headers);
return super.request(url, options);
} else if (url instanceof Request) {
const request = url;
request.url = this.rewriteUrl(request.url);
request.headers = this.updateHeaders(request.headers);
return super.request(request);
} else {
throw new Error(''First argument must be a url string or Request instance'');
}
}
private rewriteUrl (url: string) {
return environment.backendBaseUrl + url;
}
private updateHeaders (headers?: Headers) {
headers = headers || new Headers();
// Authenticating the request.
if (this.authenticationStateService.isAuthenticated() && !headers.has(''Authorization'')) {
headers.append(''Authorization'', ''Bearer '' + this.authenticationStateService.getToken());
}
return headers;
}
}
Tenga en cuenta que estoy importando la clase original de esta manera
import { Http as NgHttp } from ''@angular/http'';
para evitar conflictos de nombres.
El problema abordado aquí es que el método
request()
tiene dos firmas de llamada diferentes. Cuando se pasa el objetoRequest
lugar de lastring
URL, Angular ignora el argumento deoptions
. Entonces ambos casos deben ser manejados adecuadamente.
Y aquí está el ejemplo de cómo registrar esta clase anulada con el contenedor DI:
export const httpProvider = {
provide: NgHttp,
useFactory: httpFactory,
deps: [XHRBackend, RequestOptions, AuthenticationStateService]
};
export function httpFactory (
xhrBackend: XHRBackend,
requestOptions: RequestOptions,
authenticationStateService: AuthenticationStateService
): Http {
return new Http(
xhrBackend,
requestOptions,
authenticationStateService
);
}
Con este enfoque, puede inyectar la clase
Http
normalmente, pero su clase anulada se inyectará mágicamente en su lugar.
Esto le permite integrar su solución fácilmente sin cambiar otras partes de la aplicación (polimorfismo en acción).
Simplemente agregue
httpProvider
a la propiedad de
providers
de los metadatos de su módulo.
Para Angular 5 y superior, podemos usar HttpInterceptor para generalizar las operaciones de solicitud y respuesta. Esto nos ayuda a evitar duplicar:
1) encabezados comunes
2) Especificar el tipo de respuesta
3) Solicitud de consulta
import { Injectable } from ''@angular/core'';
import {
HttpRequest,
HttpHandler,
HttpEvent,
HttpInterceptor,
HttpResponse,
HttpErrorResponse
} from ''@angular/common/http'';
import { Observable } from ''rxjs/Observable'';
import ''rxjs/add/operator/do'';
@Injectable()
export class AuthHttpInterceptor implements HttpInterceptor {
requestCounter: number = 0;
constructor() {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
responseType: ''json'',
setHeaders: {
Authorization: `Bearer token_value`,
''Content-Type'': ''application/x-www-form-urlencoded; charset=UTF-8''
}
});
return next.handle(request).do((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) {
// do stuff with response if you want
}
}, (err: any) => {
if (err instanceof HttpErrorResponse) {
// do stuff with response error if you want
}
});
}
}
Podemos usar esta clase AuthHttpInterceptor como proveedor de los HttpInterceptors:
import { BrowserModule } from ''@angular/platform-browser'';
import { NgModule } from ''@angular/core'';
import { AppComponent } from ''./app.component'';
import { AppRoutingModule } from ''./app.routing-module'';
import { AuthHttpInterceptor } from ''./services/auth-http.interceptor'';
import { HttpClientModule, HTTP_INTERCEPTORS } from ''@angular/common/http'';
import { BrowserAnimationsModule } from ''@angular/platform-browser/animations'';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule,
BrowserAnimationsModule,
],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: AuthHttpInterceptor,
multi: true
}
],
exports: [],
bootstrap: [AppComponent]
})
export class AppModule {
}
Para responder, pregunta si podría proporcionar un servicio que envuelva el objeto
Http
original de Angular.
Algo como se describe a continuación.
import {Injectable} from ''@angular/core'';
import {Http, Headers} from ''@angular/http'';
@Injectable()
export class HttpClient {
constructor(private http: Http) {}
createAuthorizationHeader(headers: Headers) {
headers.append(''Authorization'', ''Basic '' +
btoa(''username:password''));
}
get(url) {
let headers = new Headers();
this.createAuthorizationHeader(headers);
return this.http.get(url, {
headers: headers
});
}
post(url, data) {
let headers = new Headers();
this.createAuthorizationHeader(headers);
return this.http.post(url, data, {
headers: headers
});
}
}
Y en lugar de inyectar el objeto
Http
, podría inyectar este (
HttpClient
).
import { HttpClient } from ''./http-client'';
export class MyComponent {
// Notice we inject "our" HttpClient here, naming it Http so it''s easier
constructor(http: HttpClient) {
this.http = httpClient;
}
handleSomething() {
this.http.post(url, data).subscribe(result => {
// console.log( result );
});
}
}
También creo que se podría hacer algo usando múltiples proveedores para la clase
Http
proporcionando su propia clase extendiendo la
Http
... Vea este enlace:
http://blog.thoughtram.io/angular2/2015/11/23/multi-providers-in-angular-2.html
.