【问题标题】:Setting content length of an HTTP POST request设置 HTTP POST 请求的内容长度
【发布时间】:2014-10-01 18:44:13
【问题描述】:

我正在尝试使用 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 error 400 IE 和Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection

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

【问题讨论】:

    标签: java post apache-httpclient-4.x http-content-length


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的,但它会消耗我的输入流,使其无法进一步使用?
    • 从流中读取内容确实会减少对进一步请求的使用。我不认为它会起作用。感谢您的帮助:)
    • 我的意思是说,与其传递流,不如传递内容。
    【解决方案2】:

    这很简单,也很明显。我只需要从标题中获取内容长度:

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

    【讨论】:

    • 我在我的应用程序中使用 StringEntity 类。我们应该如何在 StringEntity 中设置内容长度?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2023-03-10
    • 2012-04-07
    相关资源
    最近更新 更多