- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用响应式编程的代码库中尝试来自 Spring 5 (5.0.0.RC2) 的新 WebClient
,并且我已成功将 JSON 响应从端点映射到我的应用程序中的 DTO,效果非常好:
WebClient client = WebClient.create(baseURI);
Mono<DTO> dto = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(DTO.class));
但是,现在我正在尝试从使用 Protocol Buffer 的端点(二进制数据用作 application/octet-stream
)的响应正文,所以我想获取原始字节来自响应,然后我将自己映射到一个对象。
我使用来自 Google Guava 的 Bytes
让它像这样工作:
Mono<byte[]> bytes = client.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.exchange()
.flatMapMany(response -> response.body(BodyExtractors.toDataBuffers()))
.map(dataBuffer -> {
ByteBuffer byteBuffer = dataBuffer.asByteBuffer();
byte[] byteArray = new byte[byteBuffer.remaining()];
byteBuffer.get(byteArray, 0, bytes.length);
return byteArray;
})
.reduce(Bytes::concat)
这可行,但有没有更简单、更优雅的方式来获取这些字节?
最佳答案
ClientResponse.bodyToMono()
最后使用了一些声称支持指定类的org.springframework.core.codec.Decoder
。
所以我们应该检查 Decoder
的类层次结构,特别是 decodeToMono()
方法的实现位置和方式。
有一个 StringDecoder
支持解码为 String
,一堆 jackson 相关的解码器(在你的 DTO 示例中使用),还有一个ResourceDecoder
特别感兴趣。
ResourceDecoder
支持 org.springframework.core.io.InputStreamResource
和 org.springframework.core.io.ByteArrayResource
。 ByteArrayResource
本质上是 byte[]
的包装器,因此以下代码将提供对响应正文的访问作为字节数组:
Mono<byte[]> mono = client.get()
...
.exchange()
.flatMap(response -> response.bodyToMono(ByteArrayResource.class))
.map(ByteArrayResource::getByteArray);
关于java - 如何最好地从 Spring WebClient 的 ClientResponse 中获取字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44821187/
我正在尝试获取列表的结果,基本上是使用 Jersey RESTful API(服务器和客户端)的实体列表 UserRESTClient client = new UserRESTClient(); C
为什么我需要发布 ClientResponse: response.releaseConnection(); 有优势吗?为什么 RestEasy 不处理这个? 有时我必须释放它,有时我没有 - 这是
我有一个 REST端点为 @GET @Produces(MediaType.APPLICATION_JSON) public Response getVariables(@QueryParam("_a
我正在尝试实现 BodyExtractor 接口(interface),从 Mono 获取主体作为对象,而不是在 Mono 中获取主体。 我找不到 BodyExtractor 实现的任何示例。我想知道
我在使用 jeresy ClientRespone.getEntity 反序列化时遇到问题 我尝试遵循一些教程和问题,包括: http://jersey.576304.n2.nabble.com/Ho
首先,我有一个像这样公开的 REST URL: @PostMapping("/check/existence") @ResponseBody public Map checkExis
我正在尝试在 REST 服务器和调用客户端应用程序之间编写一种代理,以便通过向 REST 调用添加属性来强制隐私。 我不想检查来自服务器的响应,我只想将它传递给客户端。 我想用 spring-webf
如何从 Response.class 中获取资源 URI 路径/位置?当我像这样使用 Apache CXF 客户端 API 调用我的 Restful 服务时: Response res = reso
我觉得我错过了一些东西。我有一个过滤器,可以打印出服务器返回的信息,并且我报告我正在返回正确的响应(403)。我编写了一个 JUnit 测试来验证这个逻辑,很多时候我报告 200 而不是 403。奇怪
我目前正在使用 Resteasy 2.3.6.Final 并想升级到 Resteasy 3.0.4.Final。然而,API doc表示该类现在已弃用。所以我的问题是: ClientResponse
我目前正在使用 Jersey 作为代理 REST api 来调用另一个 RESTful 网络服务。一些调用将在我的服务器中以最少的处理来回传递。 有没有办法干净地做到这一点?我正在考虑使用 Jerse
我有这个 Jersey 网络资源代码: @Override public int Foo(long uId, String secretKey, long tileId) {
我在模拟 com.sun.jersey.api.client.ClientResponse 时遇到了一些问题,但只有在我设置 .type(MediaType.MULTIPART_FORM_DATA_T
我使用 jersey-client 来使用 REST 服务。我需要请求的实体和 Last-Modified header 。 所以我做了以下事情: ClientResponse response =
我正在尝试使用 Jersey 客户端调用 REST 服务(不使用 Jersey/JAX-RS)。以下代码可以很好地发布我的表单数据并接收响应: Form form = new Form();
我正在使用响应式编程的代码库中尝试来自 Spring 5 (5.0.0.RC2) 的新 WebClient,并且我已成功将 JSON 响应从端点映射到我的应用程序中的 DTO,效果非常好: WebCl
我有一个 Web 应用程序,它执行身份验证,然后检查请求中的 cookie 以允许来自同一客户端的后续调用。我写了一段代码,当我从 eclipse 运行它时它工作得很好,但是当从 android 模拟
我有一个基本的java项目,其中我已经在我的java构建中从外部导入了jersey-client-1.19.jar(使用eclipse)。我正在尝试编写一个基本的 Jersey 客户端来对 Web 服
我是 Spring Reactive 框架的新手,并尝试将 Springboot 1.5.x 代码转换为 Springboot 2.0。我需要在 Spring 5 WebClient ClientRe
我正在尝试使用 jersey 客户端通过 Web 服务获取 PreRegisterJsonResponse 对象,方法是将 preRegisterId 作为路径变量发送到服务,并在高级 REST 客户
我是一名优秀的程序员,十分优秀!