2013-09-04 2 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

아파치 HttpClient를 같은 오래된 버전을 사용하는 특별한 이유가 있습니까? – oleg

+0

이 HTTP 클라이언트 버전 만 지원하는 WebSphere 서버 (정확한 버전을 모름)를 사용하고 있기 때문에 한 가지 이유가 있습니다. –

답변

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에있는 경로 당 기본 최대 연결을 직접 설정하는 것 외에는 (당신이하는 방식으로 매개 변수를 설정할 필요가 없습니다).

또한 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