【问题标题】:Set HttpParams object in HttpClient 4.0在 HttpClient 4.0 中设置 HttpParams 对象
【发布时间】:2013-09-04 12:18:44
【问题描述】:

我正在创建新的 HttpClient,通过在它的构造函数中传递 ThreadSafeClientConnManager 和 HttpParams,但它总是抛出错误的请求错误。 为了弄清楚出了什么问题,我调试了它,但一切都是徒劳的。给我一些解决方案 这是我的代码块

sc.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
sc.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

HttpParams basicParams = new BasicHttpParams();
ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager(basicParams, sc);
ConnManagerParams.setMaxConnectionsPerRoute(
    basicParams,
    // if we have more than 5 concurrent leads, good problem to have
    new ConnPerRoute() {
        public int getMaxForRoute(HttpRoute httproute) {
        return 5;
    }
}); 

g_client = new DefaultHttpClient(connmgr, basicParams);

// It's a lead, be forgiving with timeout
g_client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
g_client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
ConnManagerParams.setTimeout(basicParams, 2000);

当我在我的代码中调用 g_client.execute(postMethod); 时,它显示 400 状态代码意味着我的请求有问题。如果我在 DefaultHttpClient 构造函数中传递 null

g_client = new DefaultHttpClient(connmgr, null);

客户端正在成功执行,但这不是正确的方法,因为我需要基本参数集maxconnectionperroute。我在这里粘贴了可疑的代码。请看看并帮助我。我被困在这里了。

我使用的是 HttpClient 4.0 版本。

【问题讨论】:

  • 您使用这种过时版本的 Apache HttpClient 有什么特别的原因吗?
  • 只是一个原因,因为我使用的 WebSphere 服务器(不知道确切的版本)只支持这个 httpclient 版本。

标签: java apache-httpclient-4.x


【解决方案1】:

在我们的一个较早的项目中,我们几乎完全按照您的要求进行操作,只是我们直接在 ThreadSafeClientConnManagersetDefaultMaxPerRoute(int) 方法上设置了每个路由的默认最大连接数(无需按照以下方式设置参数)你做)。

另外,我相信ConnManagerParams.setTimeout(basicParams, 2000) 等价于(并且可以替换为)g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000);

示例替代代码:

SchemeRegistry sc = new SchemeRegistry();
sc.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
sc.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));

ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager(sc);
connmgr.setDefaultMaxPerRoute(5);  /// Alternative approach to yours ///

DefaultHttpClient g_client = new DefaultHttpClient(connmgr);
g_client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
g_client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000);   /// Alternative approach to yours ///

【讨论】:

  • 这也是 id 解决问题的方法。不过,我可能会将连接管理器包装在服务中。
【解决方案2】:

使用默认(工作)构造函数创建对象。 然后按照 Apache HttpClient 文档中针对正在使用的版本的定义修改对象的属性。 4.5 示例:

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DefaultHttpClient.html

要管理每条路线的最大连接数等内容,请查看(涉及的不同类)文档:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多