当前位置: 首页 > 知识库问答 >
问题:

Interceptor Angular 4.3-在克隆请求上设置多个标头

陶琦
2023-03-14

我刚刚注意到,在以前的HTTP请求选项中可能使用的Header Object在新的Interceptor中不再支持。

这是新的拦截器逻辑:

// Get the auth header from the service.
const authHeader = this.auth.getAuthorizationHeader();
// Clone the request to add the new header.
const authReq = req.clone({headers: req.headers.set('Authorization', authHeader)});

现在,我有两种方法可以在这个请求中添加标题:

例子:

headers?: HttpHeaders;

    headers: req.headers.set('token1', 'asd')
setHeaders?: {
   [name: string]: string | string[];
};

    setHeaders: {
             'token1': 'asd',
             'token2': 'lol'
    }

如何在此请求上有条件地添加多个标头?与我以前处理Header对象的方法相同:

 myLovellyHeaders(headers: Headers) {
    headers.set('token1', 'asd');
    headers.set('token2', 'lol');
     if (localStorage.getItem('token1')) {
     headers.set('token3', 'gosh');
     }
    }
    const headers = new Headers();
    this.myLovellyHeaders(headers);

共有3个答案

松旭
2023-03-14

新的HTTP客户端使用不可变的headers对象。您需要存储对前面标题的引用以改变对象:

 myLovellyHeaders(headers: Headers) {
     let p = headers.set('token1', 'asd');   
     p = p.set('token2', 'lol');
     if (localStorage.getItem('token1')) {
        p = p.set('token3', 'gosh');
     }

请参阅angular 4.3中为什么HttpParams不能在多行中工作,以了解为什么需要存储对返回值的引用。

标题也是一样:

export class HttpHeaders {
  ...
  set(name: string, value: string|string[]): HttpHeaders {
    return this.clone({name, value, op: 's'});
  }

  private clone(update: Update): HttpHeaders {
    const clone = new HttpHeaders();
    clone.lazyInit =
        (!!this.lazyInit && this.lazyInit instanceof HttpHeaders) ? this.lazyInit : this;
    clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);
    return clone;
  }

要了解拦截器背后的机制,请阅读:

  • 《内幕人士指南》介绍了拦截程序和HttpClient的角度机制
尉迟高澹
2023-03-14

我的代码使用以下方法添加新标题,以新值替换以前的值:

headers: req.headers.set('token1', 'asd')
.set('content_type', 'asd')
.set('accept', 'asd')
戚俊美
2023-03-14

角4.3

在拦截器中设置多个标头:

import {
  HttpEvent,
  HttpInterceptor,
  HttpHandler,
  HttpRequest,
  HttpHeaders
} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';

import {environment} from '../../../../environments/environment';

export class SetHeaderInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    const headers = new HttpHeaders({
      'Authorization': 'token 123',
      'WEB-API-key': environment.webApiKey,
      'Content-Type': 'application/json'
    });


    const cloneReq = req.clone({headers});

    return next.handle(cloneReq);
  }
}
 类似资料:
  • 问题内容: 我的应用程序中有一个需要基本身份验证的特定请求,因此我需要为该请求设置Authorization标头。我读过有关设置HTTP请求标头的信息,但据我所知,它将为该方法的所有请求设置标头。我的代码中有这样的内容: 但我不希望我的每一个帖子请求都发送此标头。有什么方法可以仅为我想要的一个请求发送标头吗?还是我必须在请求后将其删除? 问题答案: 传递给每次调用标头的config对象中有一个标头

  • 问题内容: 在使用XMLHttpRequest进行AJAX调用时,似乎无法从JavaScript更改大多数请求标头。请注意,必须在Gecko浏览器中调用when。设置_Referer时_ ,它没有设置(我查看了使用Firebug和Tamper Data发送的请求标头)。当我设置User-Agent时,它完全搞砸了AJAX调用。但是,设置接受和_内容类型_确实可以。我们是否无法在Firefox 3中

  • 问题内容: 我想在使用Spring的请求中设置的值。 这是我的Spring请求处理代码 这是我的Java REST客户端: 这对我有用;我从服务器端获取了JSON字符串。 我的问题是:当我使用RestTemplate时,如何指定标头(例如)和请求方法(例如,…)? 问题答案: 我建议使用可以接受的方法之一,也可以为其设置。(你也可以指定要使用的HTTP方法。) 例如, 我喜欢这种解决方案,因为它是

  • 我的问题是:在使用RESTTemplate时,如何指定头(例如、,...)和请求方法(例如、,...)?

  • 问题内容: 使用PHP,是否可以使用发送HTTP标头? 我知道您可以从文件中发送用户代理。但是,你能不能也发送其他信息,如,和用? 还是有另一个功能可以完成此任务? 问题答案: 实际上,在进一步阅读该功能后: 您也许可以遵循这种模式来实现您想要的目标,但是我还没有亲自测试过。(如果它不起作用,请随时查看我的其他答案)

  • 问题内容: 我正在学习Java,正在阅读的书中包含以下有关克隆的示例。在中,即使buffer是,我的第一个实例也可以在新对象上设置缓冲区。似乎应该要求该字段才能起作用。 为什么允许这样做?是否具有允许其访问字段的特殊特权? 问题答案: 该修改并不意味着只有同一个实例可以访问域; 这意味着只有相同类的对象才能访问它。 在Java语言规范说,在6.6节,访问控制: …如果成员或构造函数被声明为私有,则