2

現在非推奨の Apache Commons HttpClient を使用する古いコードをいくつか継承しました。新しいApache HttpComponentsを使用するようにアップグレードすることを任されました。ただし、この POST リクエストを正しく機能させることができないようです。サーバーは不平を言い続けますContent-Length = 0。パラメータの追加方法の変換に問題があることは確かです。

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

私のコードが話しているサーブレットは、Apache Commons FileUpload を使用しています。私のリクエストを受け取ったときにキャッチするコードは次のとおりです。

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

以前はこのテストに問題なく合格していました。今はそうではありません。requestヘッダーを使用したり、URLEncoded クエリとして渡したりするなど、あらゆる種類の代替手段を試しました。どこかでアップグレードを間違えましたか?

注: サーブレットがリクエストを受信する方法だけを変更することはできません。変更すると、サーブレットと通信する他の多くのアプリを変更する必要があり、それは大変な作業です。

4

1 に答える 1

4

リクエストボディを設定するには、HttpPost の setEntity() メソッドを使用できます。利用可能なエンティティ タイプについては、こちらを参照してください。これにより、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);
于 2012-12-19T03:41:58.470 に答える