将生成标头方法添加到路由创建方法[关闭]

Posted

技术标签:

【中文标题】将生成标头方法添加到路由创建方法[关闭]【英文标题】:Add generating headers method to route creating method [closed] 【发布时间】:2022-01-04 15:09:21 【问题描述】:

我需要关于如何使我的代码更好的建议。 我有一个简单的类,它从使用 jwt 令牌身份验证的后端获取数据。

export class RepositoryService 

  constructor(private http: HttpClient, private envUrl: EnvironmentUrlService)  

  public getData = (route: string) => 
    return this.http.get(this.createCompleteRoute(route, this.envUrl.urlAddress), this.generateHeaders());
  

 
  private createCompleteRoute = (route: string, envAddress: string) => 
    return `$envAddress/$route`;
  
  private generateHeaders = () => 
    return 
      headers: new HttpHeaders(
        "Content-Type": "application/json",
        "Authorization": `Bearer $localStorage.getItem("token")`
        ),
    ;
  ; 

它工作得很好,但是当我得到更多的 http 方法时问题就开始了。如何更改 createCompleteRoute 以便不必在每个 http 方法中使用 generateHeaders()? 我想做一些类似的事情:

private createCompleteRoute = (route: string, envAddress: string) => 
    return `$envAddress/$route`, this.generateHeaders();
  

http 方法可能如下所示:

public getData = (route: string) => 
    return this.http.get(this.createCompleteRoute(route, this.envUrl.urlAddress));
  

但是不知道如何编写一个有效的函数。

【问题讨论】:

【参考方案1】:

按照您的要求,最好的方法是将您创建标头的逻辑带到 拦截器,这将自动将标头参数添加到每个 http 调用。

可能是这样的:

您的拦截器文件(有点像服务,但必须实现 HttpInterceptor

import  Injectable  from '@angular/core';
import 
  HttpRequest,
  HttpHandler,
  HttpEvent,
  HttpInterceptor,
 from '@angular/common/http';

// The service/way you use to get your token
import  AuthService  from '../services/auth.service';

@Injectable()
export class MyInterceptor implements HttpInterceptor 

  constructor(private authService: AuthService) 

  intercept(
    request: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> 
  
  const url="\yourAPI\endpoint";
  
    //  Get your token
    cont myToken = this.authService.getToken(); // or localStorage.getItem("token") or whatever your way to get your token
  
    
    // Add authorization header with token if available   
    if (myToken) 
    
       request = request.clone(
          setHeaders: 
            Authorization: `Bearer $currentUser.user.api_token`,
            'Content-Type': 'application/json',
          ,
          url,
        );
        
     
    
    ...
    

EXTRA:有关如何添加和更新标头以及如何使用拦截器拦截请求和响应的更多信息:

Adding & Updating Headers

Intercepting request & responses

【讨论】:

以上是关于将生成标头方法添加到路由创建方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

获取请求未通过授权标头[关闭]

如何在可以打开和关闭的循环上添加 SKnode

csharp 使用方法覆盖标头将流量路由到控制器操作的方法。

如何将中间件分配给 Laravel 中的路由(更好的方法)? [关闭]

将安全标头信息添加到从 WSDL 生成的 Java 代码

将 iPad 添加到 Apple 开发者帐户的最简单方法 [关闭]