【发布时间】:2021-08-30 07:41:42
【问题描述】:
关于 Spring Webflux 的小问题,以及如何“链接”http 调用。
通过一个具体的例子,这里是一个非常简单的 Spring MVC 示例,带有一个 rest 模板。
RestTemplate restTemplate = new RestTemplate();
HttpEntity<StepOneRequest> stepOneRequestHttpEntity = new HttpEntity<>(new StepOneRequest("foo", "bar"));
StepOneResponse stepOneResponse = restTemplate.postForObject("https://step-one-web-service:443/getStepTwoFromFooBar", stepOneRequestHttpEntity, StepOneResponse.class);
HttpEntity<StepTwoRequest> stepTwoRequestHttpEntity = new HttpEntity<>(new StepTwoRequest(stepOneResponse.getTheDependencyFromStepOne()));
StepTwoResponse stepTwoResponse = restTemplate.postForObject("https://step-two-web-service:443/getResponseFromStepTwo", stepTwoRequestHttpEntity, StepTwoResponse);
return ResponseEntity.ok(new MyResponse(stepTwoResponse.getImportantValueFromStepTwo()));
}
在这个sn-p中,我们看到的很直接。 仅初始化一个休息模板。
http 请求负载对象的构造。
使用构造的对象查询第一个外部 Web 应用程序 API 以获取响应。
重要的是,需要第一个 HTTP 调用的响应才能进行第二个 HTTP 调用。它们只能是顺序的,它需要第一次调用的结果,才能查询第二个 API。
然后,对第二个 API 的 http 调用。
最后,根据第二个 API 响应原始请求者。
现在,如果将其转换为 Webflux:
WebClient webClientStepOne = WebClient.create("https://step-one-web-service:443/getStepTwoFromFooBar");
WebClient webClientStepTwo = WebClient.create("https://step-two-web-service:443/getResponseFromStepTwo");
Mono<StepOneResponse> stepOneResponseMono = webClientStepOne.post().body(BodyInserters.fromValue(new StepOneRequest("foo", "bar"))).retrieve().bodyToMono(StepOneResponse.class);
Mono<StepTwoResponse> stepTwoResponseMono = stepOneResponseMono.flatMap(aStepOneResponse -> webClientStepTwo.post().body(BodyInserters.fromValue(aStepOneResponse.getTheDependencyFromStepOne())).retrieve().bodyToMono(StepTwoResponse.class));
return stepTwoResponseMono.map(aStepTwoResponse -> ResponseEntity.ok(new MyResponse(aStepTwoResponse.getImportantValueFromStepTwo())));
}
我有一个大问题。虽然这是正确的(它产生相同的响应)这是正确的做法吗?
尤其是带有 flatMap 的线
Mono<StepTwoResponse> stepTwoResponseMono = stepOneResponseMono.flatMap(aStepOneResponse -> webClientStepTwo.post().body(BodyInserters.fromValue(aStepOneResponse.getTheDependencyFromStepOne())).retrieve().bodyToMono(StepTwoResponse.class));
这似乎很不合时宜。这里有更好的方法吗?
另外,还有一个问题,如果我需要链接 N 个 api 调用,我们真的需要 N 个 WebClient 吗? URL 不同,不仅仅是路径,完整的 URL。当rest模板只能处理一个实例时,这里似乎,如果我需要调用N个外部服务,我需要N个WebClient。
请问在这里使用 WebClient 的正确方法是什么? 请问链接http调用的正确方法是什么?
谢谢
【问题讨论】:
标签: java spring-webflux