如何使用angular 6拦截器更改http req url

时间:2018-06-14 11:27:33

标签: angular

我正在学习Angular6 Http和拦截器。

我创建了一个拦截器

@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    console.log(req);
    if(req.url == 'https://abcd.azure.net/api/v1/getPendinList') {
      // return Observable.empty();
      console.log('hello')
    }
    const dupReq = req.clone({
      headers: req.headers.set('Consumer-Secret', 'some sample key')
    });
     return next.handle(dupReq);
  }
}

这很正常我每次点击https://abcd.azure.net/api/v1/getPendinList都会得到console.log。我想要实现的是,如果我点击这个网址,我想将此网址更改为其他内容,例如。 abcd.api.com/search。这样我的url就可以从新端点获取数据。

这是可能的以及如何。

3 个答案:

答案 0 :(得分:4)

是的,您可以使用新的HTTPREQUEST覆盖网址或克隆。但是您无法直接分配新网址,因为它是一个常量/只读属性。

//Added these lines
//const httpRequest = new HttpRequest(<any>req.method, 'abcd.api.com/search');
//req = Object.assign(req, httpRequest);


@Injectable()
export class HttpsRequestInterceptor implements HttpInterceptor {
  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    console.log(req);
    const httpRequest = new HttpRequest(<any>req.method,'abcd.api.com/search');
    req = Object.assign(req, httpRequest);
    if(req.url == 'https://abcd.azure.net/api/v1/getPendinList') {
      // return Observable.empty();
      console.log('hello')
    }
    const dupReq = req.clone({
      headers: req.headers.set('Consumer-Secret', 'some sample key')
    });
     return next.handle(dupReq);
  }
}

答案 1 :(得分:2)

ngLover答案的问题是他覆盖了所有内容,因为他正在创建新的带有空正文的http请求 正确的答案实际上更简单

const newUrl = {url: 'new-url'};
req = Object.assign(req, newUrl);

那样,只有url属性将被覆盖,其余属性(包括正文)将保持不变

答案 2 :(得分:2)

来自: https://stackoverflow.com/a/45735866/1778005

这对我有用:

const dupReq = req.clone({ url: 'mynewurl.com' });
return next.handle(dupReq);