使用Spring Webflux接连使用两个API

时间:2018-09-25 21:36:03

标签: spring-webflux

我需要编写一个新的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,然后等待响应并返回它。

我认为我显然需要付出更多的努力来学习所有这些工作原理,但是我希望有人能够为我指出正确的方向。

谢谢!

1 个答案:

答案 0 :(得分:0)

您不应返回null。那么下面的代码呢:

-d 'type=true'