Angular - Set headers for every request

前端 未结 19 1971
[愿得一人]
[愿得一人] 2020-11-22 07:43

I need to set some Authorization headers after the user has logged in, for every subsequent request.


To set headers for a particular request,



        
19条回答
  •  南旧
    南旧 (楼主)
    2020-11-22 08:15

    In Angular 2.1.2 I approached this by extending the angular Http:

    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 {
        options = this._setCustomHeaders(options);
        return super.request(url, options)
      }
    }
    

    then in my App Providers I was able to use a custom Factory to provide '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(){
    
      }
    }
    

    now I don't need to declare every Http method and can use http as normal throughout my application.

提交回复
热议问题