我使用的是spring-webflux,无法设置循环生成的不同主体
public Mono<String> getUsersAndInstrumentOrders(String serviceAddress, String data){
return webClient.method(HttpMethod.POST)
.uri(serviceAddress)
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer " + HttpWebClient.token)
.acceptCharset(StandardCharsets.UTF_8)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(data)
.exchange().log()
.flatMap(clientResponse -> {
if (clientResponse.rawStatusCode() == 400 || clientResponse.rawStatusCode() == 401) {
logger.error("Getting users failed. Error response " + clientResponse.rawStatusCode());
return Mono.empty();
} else {
logger.info("Getting users done successfully");
return clientResponse.bodyToMono(String.class);
}
}).retry(Integer.parseInt(properties.getProperty("get-users.number-of-retrying")));
}我需要在此方法之前创建一个循环,并生成一个不同的主体(数据),然后将生成的响应保存在一个列表中,并返回一个响应列表。
发布于 2020-09-28 01:53:39
在这个方法之前,我创建了一个递归方法。它生成并发出对webClient方法(getUsersAndInstrumentOrders)的输入(pageNo)。生成页码,直到源ApiServive不返回响应。
public Mono<List<User>> getUsersFromApi(Integer pageNoStart){
return getUsersAndInstrumentOrders("/api/Report/GetBrokerCustomers",pageNoStart)
.flatMap(str->{
com.google.gson.JsonObject jsObj;
if (str.length()<1){
jsObj=new com.google.gson.JsonObject();
}else {
jsObj = JsonParser.parseString(str).getAsJsonObject();
}
return Mono.just(jsObj);
}).flatMap(jsonObj->{
JsonArray array=jsonObj.getAsJsonArray("resultList");
for (int i=0; i<array.size(); i++){
JsonObject userJsObject= array.get(i).getAsJsonObject();
User user=new User();
user.setUsername(userJsObject.get("nationalId").getAsString());
user.setMobile(userJsObject.get("mobile").getAsString());
user.setIban(userJsObject.get("iban").getAsString());
user.setEnabled(true);
users.add(user);
}
if (array.size()<1) {
return Mono.just(users);
}else {
Integer newPageNo=pageNoStart+1;
return getUsersFromApi(newPageNo);
}
});
}我将数据输入体更改为固定数据和相对页码,以移动下一页
public Mono<String> getUsersAndInstrumentOrders(String serviceAddress, Integer pageNo){
logger.info("Get getUsersOrInstrumentOrders From Samat");
return webClient.method(HttpMethod.POST)
.uri(serviceAddress)
.accept(MediaType.APPLICATION_JSON)
.header("Authorization", "Bearer " + HttpWebClient.token)
.acceptCharset(StandardCharsets.UTF_8)
.contentType(MediaType.APPLICATION_JSON)
.bodyValue("{\"reportFilter\":{\"orderStatus\":0},\"optionalFilter\":{\"take\":300,\"page\":"+pageNo.toString()+"}}")
.exchange().log()
.flatMap(clientResponse -> {
if (clientResponse.rawStatusCode() == 400 || clientResponse.rawStatusCode() == 401) {
logger.error("Getting users failed. Error response " + clientResponse.rawStatusCode());
return Mono.empty();
} else {
logger.info("Getting users done successfully");
return clientResponse.bodyToMono(String.class);
}
}).retry(Integer.parseInt(properties.getProperty("get-users.number-of-retrying")));
}https://stackoverflow.com/questions/64023139
复制相似问题