【问题标题】:Modify request URI before it is sent with apache http client在使用 apache http 客户端发送之前修改请求 URI
【发布时间】:2018-05-04 05:38:07
【问题描述】:

我有一个库,调用者通过给我 HttpUriRequest(Apache HTTP 客户端)对象来发送 HTTP 请求。在某些情况下,由于某些隧道对调用者应该是透明的,我需要修改请求的 URL 以使用 HTTP 而不是 HTTPS。

我该怎么做呢?看来我不能只在对象上更改它。我唯一能看到的是创建一个新的 HttpUriRequest 对象,它是另一个对象的克隆,但 URL 已更改。

有没有更好的办法?

【问题讨论】:

    标签: java http url-rewriting apache-httpclient-4.x apache-httpcomponents


    【解决方案1】:

    可以使用自定义路由规划器将传出请求重新路由到不同的主机/路由

    CloseableHttpClient client = HttpClients.custom()
            .setRoutePlanner(new DefaultRoutePlanner(DefaultSchemePortResolver.INSTANCE) {
    
                @Override
                public HttpRoute determineRoute(
                        final HttpHost target,
                        final HttpRequest request,
                        final HttpContext context) throws HttpException {
                    return super.determineRoute(
                            target.getHostName().equals("overhere") ? new HttpHost("overthere", -1, "https") : target,
                            request,
                            context);
                }
            })
            .build();
    

    【讨论】:

    • 修改整个请求怎么样? 4.3似乎缺乏吸吮功能。我需要将mytrigger.domain.com/path/val/val 翻译成http;//realdestination.com/realpath/val/val.
    • RequestBuilder(在 4.3 中引入)和 URIBuilder(在 4.2 中引入)来救援。
    • 我在哪里可以修改它?问题是我没有看到任何可行的注入点。 RoutePlanner 绝对不是适合它的地方。 (我现在正在使用动态代理来包装整个客户端)
    • 请求拦截器
    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多