2013-09-04 22 views
7

ThreadSafeClientConnManagerとHttpParamsをコンストラクタに渡して新しいHttpClientを作成していますが、常に不正なリクエストエラーが発生します。 何がうまくいかなかったかを理解するために、私はそれをデバッグしましたが、すべて無駄でした。私は私のコードそれがあるにg_client.execute(postMethod);を呼び出したときに、いくつかの解決策を私に提供することは ここに私のコードブロックHttpClient 4.0で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); 

では、400ステータスコードが何かが私の要求が間違っていることを示しています。私は私のDefaultHttpClientコンストラクタ

g_client = new DefaultHttpClient(connmgr, null); 

にnullを渡すと、クライアントが正常に実行されているが、私は基本的paramはmaxconnectionperrouteを設定する必要があるとして、それは正しい方法ではありません。私は疑わしいコードをここに貼り付けました。見て、私を助けてください。私はここで立ち往生している。

私はHttpClient 4.0バージョンを使用しています。

+1

では、ApacheのHttpClientの、このような古いバージョンを使用しているいずれかの特定の理由はありますか? – oleg

+0

このHTTPクライアント・バージョンのみをサポートするWebSphereサーバー(正確なバージョンはわかりません)を使用している理由の1つだけです。 –

答えて

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

4

我々はほぼ正確に何をしようとしているのでしょうか?setDefaultMaxPerRoute(int)の方法で直接ルートごとのデフォルトの最大接続数をThreadSafeClientConnManagerに設定する以外は(あなたのやり方でparamsを設定する必要はありません)。

また、私は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 /// 
+0

これはidが問題を解決する方法です。 IDはおそらくサービス内の接続マネージャをラップするでしょう。 – AnthonyJClink

関連する問題