问题描述
有一个数据库,它有 2 个唯一的键。有一个 API 托管来查看数据库的值,比如说书籍的数据库,它有一个书籍 id 和另一个唯一的 id。 API 获取唯一 id 并以 JSON 格式返回图书的完整信息。这个信息量很大。而且我想创建一个mapper程序,它可以在这个API的帮助下将一个唯一的id转换成一个book id。 我正在创建一个网络客户端
webClient = WebClient.builder().baseUrl(host).defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)
.defaultHeader("Authorization",apiAuth).defaultHeader("Accept-Encoding","gzip,deflate")
.build();
所需的书籍详细信息将包含在主机 uri 中,例如https://example.com/book?uniqueCode=I03909&size=1
和多条记录可以通过给多个 uniqueCodes 并在其间提供逗号并给出大小值来实现。
我正在通过以下方式提出获取请求:
String response = webClient.get().uri(
uriBuilder -> uriBuilder.path("/books/")
.queryParam("ucodes",ucodes)
.queryParam("size",ucodesList.size())
.build())
.retrieve().bodyToMono(String.class).block();
我从这里给出逗号分隔的 ucodes 和大小。然后我得到一个 json 字符串,其中包含书籍列表,每本书都有很多字段,包括书籍 ID、作者、出版年份等。但问题是我只想要书的 id 数据,但是有很多数据来了,所以缓冲区变满了,异常来了。有什么方法可以过滤并只获取所需的数据并防止此缓冲区已满异常。
回复如下:
{
"books":[
{
"ucode":"reer2121"
"bookId":"22"
"author":.........
......
......
......
}
]
}
这里是个例外:
org.springframework.core.io.buffer.DataBufferLimitException: Exceeded limit on max bytes to buffer : 262144
at org.springframework.core.io.buffer.LimitedDataBufferList.raiseLimitException(LimitedDataBufferList.java:101)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ Body from GET http....
解决方法
如果 API 以这种方式建模,我不知道是否有过滤您需要的方法。
您可以增加 DataBufferLimit
webClient = WebClient.builder().baseUrl(host).defaultHeader(HttpHeaders.CONTENT_TYPE,MediaType.APPLICATION_JSON_VALUE)
.exchangeStrategies(ExchangeStrategies.builder()
.codecs(configurer -> configurer
.defaultCodecs()
.maxInMemorySize(10 * 1024 * 1024)) // 10 MB
.build())
.defaultHeader("Authorization",apiAuth).defaultHeader("Accept-Encoding","gzip,deflate")
.build();
增加到可以处理 10 MB,如果需要,您可以添加更多。