7

我正在创建新的 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);

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

我正在使用 HttpClient 4.0 版本。

4

2 回答 2

4

在我们的一个较旧的项目中,我们几乎完全按照您正在尝试做的事情做,只是我们直接在setDefaultMaxPerRoute(int)方法中设置每个路由的默认最大连接数ThreadSafeClientConnManager(无需像您那样设置参数)。

另外,我认为这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 ///
于 2014-02-17T04:54:02.163 回答
1

使用默认(工作)构造函数创建对象。然后按照正在使用的版本的 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

于 2013-09-12T19:17:27.373 回答