2012-12-19 20 views
2

我繼承了一些使用現在不推薦使用的Apache Commons HttpClient的舊代碼。我負責升級它以使用更新的Apache HttpComponents。但是,我似乎無法獲得此POST請求正常工作。服務器不停地抱怨,Content-Length = 0。我相當肯定,這是我的轉換參數添加方式的問題。將HttpClient的POST請求升級到HttpComponents。這裏有什麼問題?

老HttpClient的代碼看起來是這樣的:

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(); 
    ... 
} 

該servlet我的代碼,它談論的使用Apache共享文件上傳。下面是它收到我的請求時捕獲的代碼:

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

它用來通過此測試就好了。現在它不。我嘗試了各種替代方法,例如使用標題,或將request作爲URLEncoded查詢。我在升級過程中犯過錯誤嗎?

注意:我不能只是改變servlet接收我的請求的方式,因爲那樣我就不得不改變一些與它交談的其他應用程序,這太大了。

回答

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);