获取HttpClient生成的url

问题描述

如果我有一个指向 HttpClient 的 get observable 的指针,是否可以通过某种方式(通过内部变量等)获取它的请求 url?

我想在不重新发明轮子的情况下使用其生成查询。我知道这可能不是 cleanes 解决方案,但在我的场景中非常好,我已经为我的 REST API 生成了服务,只是想生成一个下载链接

解决方法

Angular HttpClient 的一些重载会返回 Observable<HttpResponse<T>>,只要您调用 HttpClient#get 参数设置为 observe"response" 重载。 See here

enter image description here

如果您选中 the documentation about Angular HttpResponse,您会看到它有一个 url 属性,并且可能包含您需要知道的内容

,

我稍微检查了 HttpClient 的代码,并承诺会创建一个 HttpRequest。无法通过获取此对象来获取属性。所以我用拦截器解决了这个问题:

@Injectable()
export class CancelRequestHttpInterceptor implements HttpInterceptor {

    static current: CancelRequestHttpInterceptor;

    constructor() { CancelRequestHttpInterceptor.current = this; }

    isActive = false;
    intercepted = new Subject<HttpRequest<any>>();

    intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
        if (this.isActive) { this.intercepted.next(request); return EMPTY; }
        return next.handle(request);
    }
}

在我做的组件中

try {
    let request: HttpRequest<any>;
    CancelRequestHttpInterceptor.current.isActive = true;
    CancelRequestHttpInterceptor.current.intercepted.pipe(first()).subscribe(v => request = v);
    this._reportService.exportReport(here,goes,my,params).subscribe();

    alert(request.urlWithParams);
}
finally {
    CancelRequestHttpInterceptor.current.isActive = false;
}

我猜,由于 JS 是单线程运行的,这个解决方案可以吗?

但是:为什么我使用静态变量而不使用 DI(我更喜欢)?因为在我的功能加载模块中,我无法解析 HttpInterceptor!我将创建一个新问题并将其链接到此处。

这里有什么改进吗?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...