【问题标题】:Preserve a HTTPEntity without consuming the stream保留 HTTPEntity 而不消耗流
【发布时间】:2021-04-01 21:58:18
【问题描述】:

我正在使用 org.apache.http.client.HttpClient 并且我正在尝试访问请求 HTTPEntity 的有效负载而不消耗底层流。 我尝试使用

EntityUtils.toString(someEntity);

但这会消耗流。 我只想保留在 HTTP 请求中发送到 String 对象的有效负载,例如

示例代码:

String uri = "someURI";
HttpPut updateRequest = new HttpPut(uri);         
updateRequest.setEntity(myHttpEntity);

任何提示表示赞赏。

【问题讨论】:

    标签: java apache-httpcomponents httpentity


    【解决方案1】:

    HttpEntity 必须是repeatable 才能重复使用。 isRepeatable() 方法显示是否是这种情况。

    两个实体是可重复的:

    • 字符串实体
    • ByteArrayEntity

    这意味着您必须将其中之一添加到原始请求中,以便您可以继续使用其内容。

    public void doExample() {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPut httpPut = new HttpPut("some_url");
        httpPut.setHeader(CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
        StringEntity jsonEntityOrso = new StringEntity("{ \"hello\": \"some message\" }");
        httpPut.setEntity(jsonEntityOrso);
        StringEntity reusableEntity = (StringEntity) httpPut.getEntity();
        String hello = readInputStream(reusableEntity.getContent());
        String hello2 = readInputStream(reusableEntity.getContent());
        boolean verify = hello.equals(hello2); // returns true
    }
    
    private String readInputStream(InputStream stream) {
        return new BufferedReader(
            new InputStreamReader(stream, StandardCharsets.UTF_8))
            .lines()
            .collect(Collectors.joining("\n"));
    }
    

    【讨论】:

    • 我会检查的。我已经在使用 StringEntity 但是,当我尝试使用 EntityUtils.toString 两次时。我得到 IOException: "Stream is closed ..." 。但我会验证我是否在任何地方都使用字符串实体。顺便说一句,圣诞快乐。
    • 圣诞快乐。顺便说一句,你是对的。似乎 EntityUtils 在获取内容后关闭流会造成问题。我已将答案更改为直接从实体中读取字符串。
    • 为我工作。由于类转换异常,只需要从 StringEntity 更改为 HTTPEntity。
    猜你喜欢
    • 2018-03-16
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2019-07-18
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多