2012-12-19 3 views
2

지금은 비추천 된 Apache Commons HttpClient를 사용하는 일부 오래된 코드를 상속 받았습니다. 새로운 Apache HttpComponents를 사용하도록 업그레이드하는 임무를 맡았습니다. 그러나, 나는 제대로 작동하려면이 POST 요청을받을 수 없습니다. 서버는 계속 Content-Length = 0이라는 불평을합니다. 나는 그것이 매개 변수가 어떻게 추가되는지에 대한 나의 변환에 문제가 있음을 확신한다.HttpClient에서 HttpComponents로 POST 요청 업그레이드. 여기서 뭐가 잘못 됐어?

PostMethod postMethod = null; 
int responseCode = 0; 
try{ 
    HttpClient httpClient = new HttpClient(); 
    postMethod = new PostMethod(getServiceUrl()); //The url, without a query. 
    ... 
    postMethod.addParameter(paramName, request); 

    responseCode = httpClient.executeMethod(postMethod); 
    ... 
} 

그리고 여기 내 HttpComponents 교체입니다 :

HttpPost postMethod = null; 
int responseCode = 0; 
HttpResponse httpResponse = null; 
try{ 
    HttpClient httpClient = new DefaultHttpClient(); 
    postMethod = new HttpPost(getServiceUrl()); //The url, without a query. 
    ... 
    BasicHttpParams params = new BasicHttpParams(); 
    params.setParameter(paramName, request); 
    postMethod.setParams(params); 

    httpResponse = httpClient.execute(postMethod); 
    responseCode = httpResponse.getStatusLine().getStatusCode(); 
    ... 
} 

서블릿 내 코드는 아파치 코 몬즈는 FileUpload을 사용하고 얘기

오래된 HttpClient를 코드는 다음과 같이 보인다. 다음은 내 요청을 수신 할 때 잡는 코드입니다.

ServletRequestContext src = new ServletRequestContext(request); 
if (src.getContentLength() == 0) 
    throw new IOException("Could not construct ServletRequestContext object"); 

이 테스트에는 문제가 없습니다. 이제는 그렇지 않습니다. 헤더를 사용하거나 URLEncoded 쿼리로 request을 전달하는 등 모든 종류의 대안을 시도했습니다. 내 업그레이드에서 실수를 저질렀 는가?

참고 : 서블릿이 내 요청을받는 방식을 변경할 수는 없습니다. 그 이유는 서블릿이 요청하는 다른 많은 앱을 변경해야하기 때문입니다. 너무 큰 일입니다.

답변

4

요청 본문을 설정하려면 HttpPost의 setEntity() 메소드를 사용할 수 있습니다. 사용 가능한 엔티티 유형 here을 탐색 할 수 있습니다. 이것은 BasicHttpParams 코드를 대체합니다.

예를 들어, 양식 개체를 보내려면 :

HttpClient httpClient = new DefaultHttpClient(); 
HttpPost httpPost = new HttpPost("http://someurl"); 
List<NameValuePair> formParams = new ArrayList<NameValuePair>(); 
formParams.add(new BasicNameValuePair("name", "value")); 
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(formParams, "UTF-8"); 
httpPost.setEntity(formEntity); 
HttpResponse httpResponse = client.execute(httpPost);