【问题标题】:How to consume HttpEntity twice?如何两次消费HttpEntity?
【发布时间】:2014-03-01 00:09:24
【问题描述】:

我正在制作一个基本代理,我目前正在尝试向客户端发送响应并缓存此响应以供将来使用。

我有以下功能:

    public HttpResponse sendRequestToServer(HttpRequest request)
{
    int bufsize = 8 * 1024;
    HttpHost host = this.getHost(request);
    HttpResponse response = null;

    try
    {
        Socket outsocket = new Socket(host.getHostName(), host.getPort());
        DefaultBHttpClientConnection outconn = new DefaultBHttpClientConnection(bufsize);
        outconn.bind(outsocket);

        HttpProcessor httpproc = HttpProcessorBuilder.create()
        .add(new RequestContent())
        .add(new RequestTargetHost())
        .add(new RequestConnControl())
        .add(new RequestUserAgent("ProxyServer 1.0"))
        .add(new RequestExpectContinue(true)).build();

        System.out.println("Outgoing connection to : " + outsocket.getInetAddress());

        HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
        HttpCoreContext context = HttpCoreContext.create();
        context.setTargetHost(host);

        httpexecutor.preProcess(request, httpproc, context);
        response = httpexecutor.execute(request, outconn, context);
        httpexecutor.postProcess(response, httpproc, context);
    }
    catch(IOException | HttpException e)
    {
        System.err.println("Error sending request: " + e);
    }
    return response;
}

如果我使用inconn.sendResponseEntity(response);,客户端可以毫无问题地得到响应。

如果我写:

String sourceString = EntityUtils.toString(response.getEntity());

inconn.sendResponseHeader(response);
inconn.sendResponseEntity(response);

页面未提供给客户端,因为 HttpEntity 已被使用。

你知道如何解决这个问题吗?

【问题讨论】:

    标签: java proxy apache-httpclient-4.x


    【解决方案1】:
    • 一个流式的、不可重复的实体,从
      • 一个 {@link InputStream}。

    每个实体类都说明其是否可重复......如上面的代码注释中所示。验证您用于响应的实体类以及该实体是否可重复。如果是,那么我认为您可以再次为缓存调用“getEntity()”。

    【讨论】:

      【解决方案2】:

      由来自打开连接的流支持的 HTTP 实体本质上是不可重复的,因此不能多次使用。您唯一的选择是通过在内存或文件中缓冲其内容来使实体可重复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-15
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 2013-07-31
        相关资源
        最近更新 更多