使用 Apache Async HTTP Client 从 InputStream 构造多部分请求

2024-05-12

我正在尝试通过 apache async http 客户端发送多部分请求,但是得到了org.apache.http.ContentTooLongException: Content length is unknown error.

我确实理解为什么异步模型中需要内容长度,但想了解这是设计使然还是错误?

我希望它将流加载到内存缓冲区中并使用它(这就是 AsyncHttpClient 所做的)。

我的测试用例是:

public class InputStreamAsMultipartPayloadTest {

    @Rule
    public WireMockClassRule instanceRule = new WireMockClassRule(9090);


    @Test
    public void inputStreamPartTest() throws Exception {

        String partBody = "hello";
        instanceRule.stubFor(any(urlPathEqualTo("/hello"))
                .withMultipartRequestBody(
                        aMultipart()
                                .withName("part-name")
                                .withHeader("Content-Type", equalTo("application/octet-stream"))
                                .withHeader("Content-Transfer-Encoding", equalTo("binary"))
                                .withBody(equalTo(partBody)))
                .willReturn(aResponse()));

        byte[] body = partBody.getBytes(UTF_8);

        try (CloseableHttpAsyncClient httpAsyncClient = HttpAsyncClients.createDefault()) {
            httpAsyncClient.start();
            HttpPost postRequest = new HttpPost(URI.create("/hello"));

            MultipartEntityBuilder multipartBuilder = MultipartEntityBuilder.create();
            multipartBuilder.addBinaryBody("part-name", new ByteArrayInputStream(body));
            postRequest.setEntity(multipartBuilder.build());

            Future<HttpResponse> fHttpResponse = httpAsyncClient.execute(HttpHost.create("http://localhost:9090"), postRequest, null);

            assertThat(fHttpResponse.get(3, TimeUnit.SECONDS).getStatusLine().getStatusCode()).isEqualTo(HttpURLConnection.HTTP_OK);
        }
    }

}

异常堆栈跟踪是:

Caused by: org.apache.http.ContentTooLongException: Content length is unknown
    at org.apache.http.entity.mime.MultipartFormEntity.getContent(MultipartFormEntity.java:101)
    at org.apache.http.nio.entity.EntityAsyncContentProducer.produceContent(EntityAsyncContentProducer.java:65)
    at org.apache.http.nio.protocol.BasicAsyncRequestProducer.produceContent(BasicAsyncRequestProducer.java:125)
    at org.apache.http.impl.nio.client.MainClientExec.produceContent(MainClientExec.java:262)
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.produceContent(DefaultClientExchangeHandlerImpl.java:140)
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.outputReady(HttpAsyncRequestExecutor.java:241)
    at org.apache.http.impl.nio.DefaultNHttpClientConnection.produceOutput(DefaultNHttpClientConnection.java:290)
    at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:86)
    at org.apache.http.impl.nio.client.InternalIODispatch.onOutputReady(InternalIODispatch.java:39)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.outputReady(AbstractIODispatch.java:145)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.writable(BaseIOReactor.java:188)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:341)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)

完整的源代码可以在以下位置找到:https://github.com/maximkir/apache-async-http https://github.com/maximkir/apache-async-http

总的来说,我是SHCF4J https://github.com/imperva/shcf4j(Simple HTTP Client For Java),致力于为常见 HTTP 客户端用例提供统一的外观。我可以在外观层面上修复它,但更喜欢尽可能保持其逻辑最少。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Apache Async HTTP Client 从 InputStream 构造多部分请求 的相关文章

随机推荐

  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • 上传非常大的文件(>5GB)

    我需要你的帮助 我想用 HTML JQuery 和 PHP 创建一个上传脚本 是否可以编写一个可以上传非常大的文件 gt 5 GB 的脚本 我已经尝试使用 FileReader FormData 和 Blobs 但即使使用这些 我也无法上传
  • 如果所有情况都是真正的 PHP,如何处理这些情况

    我想知道是否有办法继续完成所有三种情况 如果它们都是真的 但是使用break 因为作为一个例子 如果第一种情况是真的 第二种情况是假的 第三种情况也是假的 而且我没有使用break 无论如何它都会进行 将strtotime更改为2014年1
  • ListView 多选行为?

    Comtl32 dll v6 0中的ListView进行多项选择 使用Shift键时 如下 x表示选择 00xxxx xxxxxx xxxx00 早期版本的 ListView 的做法如下 00xx00 00xx00 00xx00 有没有办法
  • 为什么在 ES6 中不应该使用 import all

    所以我最近开始学习 React 并注意到所有文档都有类似的导入 import Apples Bananas Oranges from fruits 但是在研究 React 时我发现这种语法也同样有效 import as Fruits fro
  • phpunit --debug 仍然只显示点

    我想查看 phpunit 运行期间当前执行的测试 我用 debugparam 但仍然只得到点 phpunit debug PHPUnit 3 7 19 by Sebastian Bergmann Configuration read fro
  • 如何在Java,Apache POI中获取Excel单元格字段的字体样式?

    我想用Java捕获Excel中单元格字段的字体 我正在使用 Apache POI 如果可以的话我想捕捉font color font family font weight font size etc 我怎样才能实现这个目标 根据评论进行编辑
  • PHP 中的 SQL 语句与 phpmyadmin 中的 SQL 语句的行为不同

    I have form store sql INSERT INTO myodyssey myaccount id email username password VALUES NULL email unixmiah formtest woo
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • JPA EntityManager createQuery() 与 createNamedQuery() 和 createNativeQuery()

    谁能解释一下 JPA 的以下方法之间的区别实体管理器 createQuery createNamedQuery createNativeQuery 并告诉我在什么情况下我们应该使用哪种方法 创建查询方法用于创建动态查询 这些查询是直接在应用
  • IntelliJ 无法识别 JPA 静态元模型

    我使用 JHipster 生成应用程序 并使用 Gradle 作为构建工具 当我创建实体时 我添加了过滤支持 这会生成 JPA 静态元模型 但 IntelliJ 无法识别元模型 我已经在 IntelliJ 上启用了注释处理器设置 但它似乎不
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • 如何用if条件编写ini文件

    我想编写一个带有 if else 条件的 ini 文件 我用 python 中的 ConfigParser 解析它 如何在ini文件中使用if和else语句 如果我明白你在问什么 您可能想要做的是这样的 在 INI 文件中设置条件值 sec
  • Kendo ASP.NET MVC 帮助器 Grid 泛型类

    我有以下困境 我正在尝试在部分视图内创建一个 Kendo UI 网格 该网格将与不同类型的对象一起使用 并且可以支持删除或创建等操作 该对象看起来像这样 public class GridViewModel public Type Obje
  • 使用复选框清除表单

    我正在尝试使用复选框来清除表单 但我不希望重置来清除复选框本身 我使用的代码如下
  • 如何在 Yii 中设置 returnUrl 值

    我正在使用 Yii 我遇到的问题是Yii app gt user gt returnUrl 它总是让我回到index php page 由于我不知道用户从哪个页面访问了当前页面 如何将其值设置为请求当前页面的页面 您可以使用Yii app
  • 将字符定义为单词边界

    我已经定义了 字符在乳胶模式下充当单词组成部分 我对结果非常满意 唯一困扰我的是像这样的序列 alpha beta被视为单个单词 当然 这是预期的行为 有没有办法让 emacs 将特定字符解释为单词 starter 这样 它将始终被视为其后
  • “rake db:seed”和 rake db:fixtures:load 之间有什么区别

    我是 Ruby 和 Rails 的新手 对某些事情感到好奇 在两个不同的教程中 我看到他们使用不同的方法用基本测试信息填充数据库 一种方法是使用 rake db seed 从包含示例数据的文本文件中提取数据 另一个使用 rake db fi
  • PromQL:查询警报是否被静音

    我已成功消除了当前已关闭节点的警报 并且在我们有时间物理替换它之前会持续一段时间 虽然我认为沉默会阻止警报在 Slack 通道中重新出现 但我也想在我们在 Prometheus 之上运行的 Grafana 仪表板上删除它 这是对 grafa
  • 使用 Apache Async HTTP Client 从 InputStream 构造多部分请求

    我正在尝试通过 apache async http 客户端发送多部分请求 但是得到了org apache http ContentTooLongException Content length is unknown error 我确实理解为