我需要编写一个新的api,它将使用一些参数,使用和使用现有的api,然后使用此结果使用第二个现有的api。 我以前没有使用过Spring 5,但是我已经注意到将不再使用rest模板,而应该使用webflux。 我已经完成了一些有关简单案例的教程,但不确定如何实现我的特定问题。
鉴于我有以下两个API:
@GetMapping("/foo/{id}")
public Foo getById(@PathVariable int id) {
return new Foo(id, "foo");
}
@PostMapping("/bar")
public Bar createBar(@RequestBody Bar bar) {
return bar;
}
我有一个包含新api的新springboot应用程序:
@SpringBootApplication
@RestController
public class ReactiveClientApplication {
@Bean
WebClient fooWebClient() {
return WebClient.builder()
.baseUrl("http://localhost:8080/foo")
.build();
}
@Bean
WebClient barWebClient() {
return WebClient.builder()
.baseUrl("http://localhost:8080/bar")
.build();
}
// This works fine
@PostMapping("/foo/{fooId}")
public Mono<Foo> foo(@PathVariable Integer fooId) {
return fooWebClient()
.get()
.uri("/{id}", fooId)
.retrieve()
.bodyToMono(Foo.class);
}
// This works fine
@PostMapping("/bar")
public Mono<Bar> bar() {
return barWebClient()
.post()
.body(Mono.just(new Bar("bar", new Date())), Bar.class)
.retrieve()
.bodyToMono(Bar.class);
}
// I cannot get this to work
@PostMapping("/foobar/{fooId}")
public Mono<Bar> fooBar(@PathVariable Integer fooId) {
Mono<Foo> fooMono = fooWebClient().get().uri("/{id}", fooId).retrieve().bodyToMono(Foo.class);
fooMono.flatMap(foo -> {
Mono<Bar> barMono = barWebClient().post().body(Mono.just(new Bar(foo.getFooStuff(), new Date())), Bar.class)
.retrieve().bodyToMono(Bar.class);
return barMono;
});
return null;
}
public static void main(String[] args) {
new SpringApplicationBuilder(ReactiveClientApplication.class)
.properties(Collections.singletonMap("server.port", "8081"))
.run(args);
}
}
foobar方法需要调用并等待foo的响应,使用它来调用bar,然后等待响应并返回它。
我认为我显然需要付出更多的努力来学习所有这些工作原理,但是我希望有人能够为我指出正确的方向。
谢谢!
答案 0 :(得分:0)
您不应返回null。那么下面的代码呢:
-d 'type=true'