【问题标题】:Apache HttpClient 4.3.x has no default host?Apache HttpClient 4.3.x 没有默认主机?
【发布时间】:2014-04-02 16:49:09
【问题描述】:

HttpClient 4.3.x 问题。

似乎没有办法在 CloseableHttpClient 上为 4.3.x 附加默认主机。

这令人沮丧,因为它要求您的所有请求构建器预先了解所有主机信息,而不是仅仅构建特定于调用的请求部分并让客户端填写任何遗漏的默认值(例如,像默认主机、端口等)。

在 4.2.x 及之前的版本中,您可以在客户端设置默认主机,任何请求只需要一个子路径 + 参数。

但是在 4.3.x 中,你会混淆 setRoutePlanner(x)(可能有代理设置)和 setProxy(x)(可能会被路由规划器覆盖)层,我很困惑它们是如何与实际的客户端实例。并且调试它表明路由规划器不会被用于 default_host,并且 4.3.2 版本实际上期望设置已弃用的 ClientPNames.DEFAULT_HOST(对于空目标主机的情况),这可能是一个缺陷。

我发现 apache httpclient 在所有这些变化中都处于领先地位。

不幸的是,这些示例并没有完全阐明 http 客户端的使用。

顺便说一句:新设计太烂了,为什么不直接设置 setDefaultHost(x) 呢?并消除对代理分层的困惑。

除非我遗漏了什么,否则如何在 http 客户端 4.3.x 中设置默认主机?

您认为他们为什么改变并决定在请求对象中预先设置所有内容而不是在客户端中设置默认值?

【问题讨论】:

  • "调试它显示路由规划器不会被用于 default_host,并且 4.3.2 版本实际上期望设置已弃用的 ClientPNames.DEFAULT_HOST(对于空目标主机的情况),即也许是一个缺陷”这确实是一个缺陷。空目标作为路线规划器的输入应该是完全合法的。请针对此缺陷为项目提出 JIRA
  • 谢谢。一般来说,为什么 httpclient 项目决定以需要持有所有这些部分/部分的方式将这么多客户端外部化?让所有这些组件都被覆盖是很好的,但是为了构建请求对象而不是在客户端上设置属性并让它使用默认值来水合请求对象,这并不好。
  • 鉴于您帖子的情绪,我怀疑我要说的任何话都会有所作为。

标签: apache-httpclient-4.x


【解决方案1】:

这是如何使用自定义路由规划器提供默认目标主机

HttpRoutePlanner routePlanner = new DefaultRoutePlanner(DefaultSchemePortResolver.INSTANCE) {

    @Override
    public HttpRoute determineRoute(
            final HttpHost target,
            final HttpRequest request,
            final HttpContext context) throws HttpException {
        return super.determineRoute(
                target != null ? target : new HttpHost("some.default.host", 80),
                request, context);
    }

};
CloseableHttpClient client = HttpClients.custom()
        .setRoutePlanner(routePlanner)
        .build();

【讨论】:

  • 对我来说,这对未来的 httpclient 计划一无所知,但上面的内容非常冗长,无法在客户端上完成简单的默认主机设置,我敢打赌,如果您查看您的客户,您会发现90% 以上的时间都是默认主机,所以现在他们必须为此做混入......当他们对动态“切换”主机的能力不感兴趣时​​。
  • 在 HC 3.x 时代,由于组件体系结构的固有限制,过去添加参数是没有充分理由的(通常是因为某些人设法在邮件列表中产生了足够多的噪音)。引入新参数是定制许多 HC 核心组件行为的唯一方法。结果,HC 3.x 最终有几十个参数,其中大多数在非常特定的应用程序上下文之外完全不相关。可悲的是,HC 4.0 很大程度上继承了 3.x 偏好 API(出于各种原因),并带有所有这些边际有用的参数。
  • 续:HC 4.3 仅提供有限数量的通用参数,适用于各种应用程序上下文。仍然可以通过注入处理程序或策略接口的自定义实现来自定义 HttpClient 行为。默认目标主机是一个很好的例子,它一开始就不应该用作配置参数。
  • 这个答案应该被接受,因为它解决了默认主机问题。
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多