【问题标题】:How to map functions to REST compliant endpoints with Spring Cloud Function如何使用 Spring Cloud Function 将函数映射到 REST 兼容的端点
【发布时间】:2019-12-22 04:47:00
【问题描述】:

我遇到了不寻常且有趣的技术以及使用Spring Cloud Function 拆分业务和技术实现的方法,这使得java.util.function 类的实现可以充当端点

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-function-web</artifactId>
</dependency>

简而言之,有一个简单的静态 List&lt;Book&gt; 代表一个存储库:

private final static List<Book> books = Arrays.asList(
    new Book(1, "One"),
    new Book(2, "Two"),
    new Book(3, "Three"));    

以下@Bean根据方法名称及其返回类型启用指定端点:

// GET localhost:8080/books -> returns all the books:
@Bean
public Supplier<List<Book>> books() {
    return () -> books;
}

// GET localhost:8080/book/2 -> returns a particular book
@Bean
public Function<Integer, List<Book>> book() {
    return id -> books.stream().filter(b -> b.getId() == id).collect(Collectors.toList());
}

// POST localhost:8080/newBook -> posts a new book and returns all of them
// Consumer<Book> would supply the POST with no output
@Bean
public Function<Book, List<Book>> newBook() {
    return book -> {
        books.add(book);
        return books;
    };
}

问题:

  1. 是否可以使用 java.util.function 中的一个或多个类组合来实现完全符合 REST 的解决方案?我只能创作上面的那些。我对以下模式特别感兴趣:

    GET       /books
    GET       /books/1
    POST      /books
    PUT/PATCH /books/1
    DELETE    /books/1
    GET       /books/1/chapters/2/paragraphs/3
    
  2. 如何避免端点的方法名称冲突,因为所有方法似乎都必须遵循空参数签名规则,否则不可自动装配。我从https://www.baeldung.com/spring-cloud-function 开始,它看起来很像RPC than REST

  3. 有没有办法识别网址参数?

    GET       /books?sort=name
    

【问题讨论】:

    标签: java spring rest java-8 spring-cloud


    【解决方案1】:

    他们的官方文档或博客文章中都没有明确说明这种方式。我不能肯定地说它是为这种用例设计的。

    无论如何,在文档的一部分中。提到以下几点:

    Functions 也可以是 Flux 或 Flux,Spring Cloud Function 负责将数据转换为所需的类型,只要它以纯文本或(在 POJO 的情况下)JSON 的形式出现。还支持 Message ,其中 message 标头从传入事件中复制,具体取决于适配器。 Web 适配器还支持从表单编码数据到 Map 的转换,如果您将该功能与 Spring Cloud Stream 一起使用,那么消息负载的所有转换和强制功能也将适用。

    消息可以接受输入和输出,并且它还(如文档中所述)能够对数据进行编码以映射您可以存储查询参数或标题参数的位置。

    这里the Project GitHub和官方Documentation

    【讨论】:

    • 一个令人满意且合理的答案。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多