有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在RESTAPI中一次性发布复杂对象,还是逐步添加子资源?

假设您有一个通过应用RESTful原则构建的web服务。你有一个可以发布新文章的URL/articles是路径

每篇文章由标题、日期、描述等组成。。。(原始值)以及更复杂的关系,如文章应放置的类别、位置等

当您在上创建资源后对其执行GET时,例如/articles/123456,您将得到一个JSON响应,其中包含所有基本数据,如标题等,以及包含位置、类别等URL的简单字段。我不会将这些数据嵌入文章中

但是当你创作一篇新文章时,正确的做法是什么呢?我应该嵌入类别、位置等(更像是与其他复合对象的关系),还是应该先发布一篇包含简单数据的新文章,然后逐步向其中添加数据

比如/articles/123456/categories POST

或者这是否取决于业务需求,即创建文章需要哪些数据?你会怎么做


共 (2) 个答案

  1. # 1 楼答案

    拥有可变的子资源(或集合)可能有用,也可能没有。想想API消费者,他想如何使用你的API?还要考虑相关资源的生命周期;这些实体能独立生存吗?考虑到这些因素,你应该能很好地了解自己是否需要改变这些子资源/集合。无论如何,我要说的是从小处着手,在一个合理的起点上把这些资源与文章一起发布(并与文章一起发布)。您可以随时添加API方法,以便在以后修改/查询子资源/集合

  2. # 2 楼答案

    我认为使用多个帖子来更新/创建每个实体更简单。如果你想在“大爆炸”中完成所有的事情,你可能需要在添加表单对象之前编写几段代码来将表单对象拆分成多个实体

    例如,假设您正在创建一篇新帖子,并为其分配两个标记。你的HTML表单是这样的

    <form ..>
      <input name="postId" ../>
      <input name="subject" ../>
      <input name="content" ../>
      <input name="tagIds" value="1001"../>
      <input name="tagIds" value="1002"../>
    </form>
    

    (我相信)你不能一次就把它映射到Post和Tag实体中。因此,您必须创建一个具有所有这些属性的表单支持对象:

    public class NewPostForm {
      private long postid;
      private String subject;
      private String content;
      private List<String> tagIds;
      ..
    }
    

    然后,在将它们保存到持久层之前,您必须先将它们分割成一个帖子并标记对象

    @RequestMapping(..)
    public String createNewPost(@ModelAttribute(..) NewPostForm form,..) {
      Post newPost = .. // create post from form
    
      List<Tag> tags = .. // create tag collections from form
    
      // save through persistence layer
    }
    

    然而,如果每个实体类使用单独的POST,则不需要这个新的postform类