我正在尝试使用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()
没有给我正确的输入流长度,我在Chrome中得到Http错误400 IE和Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection
。
我做错了吗?有没有其他方法可以实现它?
答案 0 :(得分:1)
这很简单也很明显。我只需要从标题中获取内容长度:
basicHttpEntity.setContentLength(Integer.parseInt(request.getHeader("Content-Length")));
答案 1 :(得分:0)
available()
函数不提供流内容的实际长度,而是
返回可以在不阻塞的情况下从此输入流中读取的字节数。 (来自javadoc)
我建议你先从流中读取整个内容,然后将其设置为内容,而不是传递流对象。这样,您还将获得内容的实际长度。