2012-07-26 658 views
1

我想使用Apache HTTP客户端发出Http POST请求。我试图将HTTP POST请求的内容(在我的应用程序中接收)复制到另一个HTTP POST请求(从我的应用程序发起到另一个URL)。代码如下所示:设置HTTP POST请求的内容长度

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 error 400 IE和Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection

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

回答

1

这很简单,非常明显。我只需要从头文件获取内容长度为:

basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length"))); 
+0

我在我的应用程序中使用StringEntity类。我们应该如何在StringEntity中设置内容长度? – 2015-12-10 09:51:18

0

available()功能不提供流的内容的实际长度,而

返回可以从该输入流无阻塞读取的字节数。 (From javadoc

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

+0

是的,但它会消耗我的输入流,使它无用,以供进一步使用?从流中读取内容的 – 2012-07-26 06:45:54

+0

确实使其用于更少的请求。我不认为这会奏效。感谢您的帮助:) – 2012-07-26 07:15:28

+0

我的意思是说,而不是传递流,传递内容。 – 2012-07-26 13:21:24