当前位置: 首页 > 知识库问答 >
问题:

如何将Spring WebClient get Application/Octet-Stream作为主体输入流处理?

邹麻雀
2023-03-14

我正在下载带有GET请求的文件。其中有些相当大,所以我希望将它们作为一个流来获取,并在能够处理它们时以块的形式读取字节,而不是在内存中读取整个文件。

WebClient看起来很合适,但我遇到了“UnsupportedMediaTypeException:内容类型'application/octet-stream'不受支持”。

下面是一些简短的示例代码。

@Autowired WebClient.Builder webClientBuilder;
....
ClientResponse clientResponse = webClientBuilder.clientConnector(this.connector)
.build()
.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exhange()
.block(Duration.of(1, ChronoUnit.MINUTES));

// blows up here, inside of the body call
InputStream responseInputStream = clientResponse.body(BodyExtractors.toMono(InputStream.class)).block(Duration.of(1, ChronoUnit.MINUTES));

这里是堆栈跟踪的一大块。

org.springframework.web.reactive.function.UnsupportedMediaTypeException: Content type 'application/octet-stream' not supported
   at org.springframework.web.reactive.function.BodyExtractors.lambda$readWithMessageReaders$20(BodyExtractors.java:254)
   at java.util.Optional.orElseGet(Optional.java:267)
   at org.springframework.web.reactive.function.BodyExtractors.readWithMessageReaders(BodyExtractors.java:250)
   at org.springframework.web.reactive.function.BodyExtractors.lambda$toMono$2(BodyExtractors.java:92)

......

我确信spring webclient必须支持JSON以外的东西。我只是不知道怎么做。救命?

共有1个答案

华佐
2023-03-14

不是专家,但您可以得到一个flux ,其中每个发布的数组将包含响应体的一个片段),而不是输入流,使用

.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.retrieve()
.bodyToFlux(byte[].class)

如果愿意,您还可以使用bytebuffer而不是byte[]执行同样的操作。

 类似资料:
  • Java8集合提供了以流形式获取集合的特性。然而,一旦我们调用stream()方法,我们就会以stream的形式获得集合的当前内容。如果我的集合在流处理过程中增长怎么办?流上的操作可能会用更多的数据更新集合。有没有一个简单有效的方法来处理这种情况?

  • 问题内容: 我正在开发一个必须将Excel文件导入MySQL的PHP​​应用程序。所以我需要将Excel文件转换为.csv格式。但是当我想使用来获得它的类型时,我就得到了它的mime-type。 我认为这里有问题。因为我将以下列表收集为.csv文件mime-type: 怎么了 ? 问题答案: 在这种情况下,官方的HTTP规范总是很有帮助的。从RFC 2616 7.2.1 (我的重点已添加): 任何

  • 问题内容: 我在Google中警告我的字体: 资源被解释为字体,但以MIME类型application / octet-stream传输:“ … / Content / Fonts / iconFont.ttf”。 即使我有此警告也可以,但是我更喜欢避免此警告。 这里是我的报关表: 我已经搜索过其他帖子,但到目前为止还没有运气。 请注意,我的服务器是Microsoft的IIS。 知道如何避免此警告

  • 我正在创建一个android应用程序,它需要一个到服务器的永久TCP连接。 我创建了一个服务,用于建立连接并侦听Inputstream上的传入字节(该服务在后台运行)。 前4个传入字节表示完整消息的消息长度。 在将完整的消息从Inputstream读入单独的缓冲区后,我想在分析消息的单独线程中调用另一个服务/异步任务。(服务应继续侦听更多传入消息)。 Android/Java中是否有一个现有的Me

  • 但最后一句话是: org.glassfish.jersey.message.internal.messageBodyProviderNotFoundException:找不到媒体的MessageBodyReader type=application/octet-stream,type=class com.app.weather.providers.org.openweatherap.pojo.we