我正在通过在其构造函数中传递ThreadSafeClientConnManager和HttpParams来创建新的HttpClient,但它总是抛出错误的请求错误。 为了弄清楚出了什么问题我调试了它但都是徒劳的。为我提供一些解决方案 这是我的代码块
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版本。
答案 0 :(得分: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 ///
答案 1 :(得分:1)
使用默认(工作)构造函数创建对象。 然后根据正在使用的版本的Apache HttpClient文档中的定义修改对象的属性。 4.5的例子:
为了管理每条路线的最大连接数,请查看(涉及的不同类)文档:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html