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

我与之交谈的代码的 servlet 正在使用 Apache Commons FileUpload。这是它收到我的请求时捕获的代码:

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

它曾经很好地通过了这个测试。现在没有了。我尝试了各种替代方法,例如使用标头或request作为 URLEncoded 查询传递。我在某个地方的升级中犯了错误吗?

注意:我不能只更改 servlet 接收我的请求的方式,因为那样我将不得不更改许多与之对话的其他应用程序,而这是一项太大的工作。

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 回答