代码之家  ›  专栏  ›  技术社区  ›  firasKoubaa

angular:在httpclient中使用http的requestoptions

  •  1
  • firasKoubaa  · 技术社区  · 6 年前

    我要从 HTTP协议 httpclient公司 我习惯加一些 标题 我的http请求如下:

    import { RequestOptions, Request, RequestMethod, Headers } from '@angular/http';
    
    
    this.pass = btoa(cuid + ': ');
    this.pass = "Basic " + this.pass;
    this.header = new Headers();
    this.header.set("Authorization", this.pass);
    let options = new RequestOptions({
      headers: this.header
    });
    
    return this.http.post(myServiceUrl, {}, options)
    

    现在,当迁移到httpclient时,我已经尝试了:

    import {HttpClient, HttpHeaders} from '@angular/common/http';
    
        const header = new HttpHeaders();
        const pass = 'Basic ' + btoa(cuid + ': ');
        header.set('Authorization', pass);
        const options =  ({
          headers: header
        });
        return this.httpClient.post(myServiceUrl, {}, options);
    

    但正如你所看到的,我发现 请求选项 ,整个处理无法添加相同的头。

    建议??

    3 回复  |  直到 6 年前
        1
  •  4
  •   J. Pichardo    6 年前

    这个 HttpClient.post 方法具有以下签名:

    post(url: string, body: any | null, options: OptionsType)
    

    其中 OptionsType 以下是(相当于 RequestOptions )

    {
      headers?: HttpHeaders | { [header: string]: string | string[] };
      observe?: "body";
      params?: HttpParams | { [param: string]: string | string[] };
      reportProgress?: boolean;
      responseType: "arraybuffer";
      withCredentials?: boolean;
    };
    

    从那里你可以给你分配标题或参数,比如:

    const options = {
      headers: new HttpHeaders().append('key', 'value'),
      params: new HttpParams().append('key', 'value')
    }
    
    
    this.httpClient.post(url, {}, options)
    

    你也可以看看 this question

        2
  •  0
  •   Mike Tung    6 年前

    HTTP客户端等效值应为:

    const headers = new HttpParams().set('Authorization', pass);
    return this.httpClient.post(myServiceUrl, {}, {headers: headers});
    
        3
  •  0
  •   Nicholas Pesa    6 年前

    我以前做这件事是为了 getHeaders(token) :

      getHeaders(token) {
        return new HttpHeaders().set('Authorization', `Bearer ${token}`);
      }
    

    然后,在发出请求时,只需将其附加到请求中,如下所示:

    this.http.post(url, body, this.getHeaders(token));

    还有一个httpinterceptor可以自动处理请求,下面是一篇文章: https://www.intertech.com/Blog/angular-4-tutorial-handling-refresh-token-with-new-httpinterceptor/

    我已经用firebase auth完成了这样的标记。 以下是token.interceptor.ts文件:

    @Injectable()
    export class TokenInterceptor implements HttpInterceptor {
    
      afAuth: any;
    
      constructor(
        private inj: Injector
      ) { }
    
      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        this.afAuth = this.inj.get(AngularFireAuth);
    
        return this.getToken().pipe(
          switchMap(token => {
            request = request.clone({
              setHeaders: {
                Authorization: `Bearer ${token}`
              }
            });
    
            return next.handle(request);
          })
        );
      }
    
      getToken() {
        return Observable.fromPromise(this.afAuth.auth.currentUser.getIdToken());
      }
    }
    

    然后您需要将其提供给顶级app.module,如下所示:

    { provide: HTTP_INTERCEPTORS, useClass: TokenInterceptor, multi: true }

    这里要做的是为每个自动处理的http请求设置授权令牌,这样您就不必在发出请求之前等待令牌。请记住,这是非常具体的firebase auth,因为这是给我的jwt令牌。希望这能有所帮助!