1

我正在尝试使用 apache HTTP 客户端发出 Http POST 请求。我正在尝试将 HTTP POST 请求的内容(在我的应用程序中接收)复制到另一个 HTTP POST 请求(从我的应用程序启动到另一个 URL)。代码如下所示:

httpPost = new HttpPost(inputURL);
// copy headers
for (Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements();) {
      String headerName = e.nextElement().toString(); 
      httpPost.setHeader(headerName, request.getHeader(headerName));
}

BufferedInputStream clientToProxyBuf = new BufferedInputStream(request.getInputStream());
BasicHttpEntity basicHttpEntity = new BasicHttpEntity();
basicHttpEntity.setContent(clientToProxyBuf);
basicHttpEntity.setContentLength(clientToProxyBuf.available());

httpPost.setEntity(basicHttpEntity);

HttpResponse responseFromWeb = httpclient.execute(httpPost);

基本上,我正在尝试实现一个代理应用程序,它将获取一个 url 作为参数,将请求转发到该 URL,然后以自定义外观提供页面等。

request是 HttpServletRequest。我在设置内容长度时遇到问题。通过调试,我发现clientToProxyBuf.available()没有给我正确的输入流长度,并且我得到了 Http 错误 400 IE 和Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connectionchrome。

我做错了吗?还有其他方法可以实现吗?

4

2 回答 2

1

available()函数不提供流内容的实际长度,而是

返回可以不阻塞地从此输入流中读取的字节数。(来自javadoc

我建议您首先从流中读取整个内容,然后将其设置为内容,而不是传递流对象。这样,您还将获得内容的实际长度。

于 2012-07-26T06:36:35.200 回答
1

这是相当简单且非常明显的。我只需要从标题中获取内容长度:

basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
于 2012-07-26T07:13:56.693 回答