我是使用 webclient 來使用 Rest API 的新手,我想知道如何過濾回應以僅匹配我想要的內容。
所以我有這個端點,它給我帶來了一個 customerById,但我只需要顯示 systemsId = 100
讓我展示:
@GetMapping("/getCucoId/{cucoId}")
public Mono<CuCoPerson> getCucoRelationById(@PathVariable Integer cucoId) {
WebClient webClient = WebClient.create();
return webClient.get()
.uri(GET_RELATION_BY_ID cucoId)
.header("Accept", "application/json")
.header("Authorization", "Bearer eyJraWQiOi.....")
.retrieve()
.bodyToMono(CuCoPerson.class);
}
和 POJO:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CuCoPerson {
private Integer cucoID;
private List<CustomerRelation> relatedCustomers;
}
這是郵遞員的回應:
{
"cucoID": 100288298,
"relatedCustomers": [
{
"customerId": "F6305957",
"systemId": 100
},
{
"customerId": "F8364917",
"systemId": 400
},
{
"customerId": "F4194868",
"systemId": 101
}
]
}
所以我只需要顯示只有 systemID = 100 的相關客戶
提前致謝!
uj5u.com熱心網友回復:
我認為您正在尋找Mono.map()或Mono.flatMap()。
洗掉函式中不匹配的客戶,并回傳更改后的物件。
@GetMapping("/getCucoId/{cucoId}")
public Mono<CuCoPerson> getCucoRelationById(@PathVariable Integer cucoId) {
WebClient webClient = WebClient.create();
return webClient.get()
.uri(GET_RELATION_BY_ID cucoId)
.header("Accept", "application/json")
.header("Authorization", "Bearer eyJraWQiOi.....")
.retrieve()
.bodyToMono(CuCoPerson.class)
.map(cuCoPerson -> {
List<CustomerRelation> matches = cuCoPerson.getRelatedCustomers()
.stream()
.filter(relation -> relation.getSystemId().equals(100))
.collect(Collectors.toList());
cuCoPerson.setRelatedCustomers(matches);
return cuCoPerson;
});
}
正如其他答案中提到的,在客戶端進行這種過濾是不好的做法。如果可能,API 應該公開引數systemId并僅回傳您需要的資料。
uj5u.com熱心網友回復:
首先,這是糟糕的后端設計。由于您(客戶端)需要此類資訊,因此您應該有一個端點可用于通過客戶 ID 和系統 ID 獲取您的資訊。資料過濾應該在后端完成,客戶端應該盡可能的瘦。否則,您將在服務器端和客戶端執行邏輯,并通過網路發送一些完全不需要的資訊,然后在客戶端將其過濾掉。但是,如果這是您的可用資源并且您無法更改服務器端,那么您將獲取 JSON 回應,并將其決議為映射到該 JSON 的類,或者Map<String,Object>如果您沒有該JSON 的類,則決議為自己過濾掉。格森圖書館。此外,我在 Jackson 庫上撰寫了自己的簡單包裝器,以簡化使用。JsonUtils類作為 MgntUtils 庫的一部分提供(由我撰寫和維護)。此類僅具有允許您從/到類實體的 Json String 決議和反序列化的方法。這是一個關于如何將 JSON 字串決議為Map<String,Object>withJSONUtils類的簡單示例
Map<String,Object> myMap
try {
myMap = JsonUtils.readObjectFromJsonString(myJsonStr, Map.class);
} catch(IOException ioe) {
....
}
MgntUtils 庫可作為Maven 工件和在Github上使用(包括源代碼和 Javadoc)
uj5u.com熱心網友回復:
它可能是這樣的:
return webClient.get()
.uri("/someUrl")
.header("Accept", "application/json")
.header("Authorization", "Bearer eyJraWQiOi.....")
.retrieve()
.bodyToFlux(CuCoPerson.class)
.filter(cuCoPerson -> cuCoPerson.getRelatedCustomers().stream().anyMatch(cr -> cr.getSystemId() == 100))
.take(1)
.next();
但這有一個缺點,即您在客戶端(您的應用程式)上過濾結果。我會嘗試詢問 api 提供者是否能夠提供過濾器引數(類似于systemId),在這種情況下,您將使用該查詢引數呼叫端點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494891.html
上一篇:NestJS:全域例外過濾器沒有捕獲從基于Kafka的微服務應用程式拋出的任何內容
下一篇:2個容器之間的休息呼叫失敗
