工厂方法设计模式的RESTful实现

工厂方法设计模式的RESTful实现,rest,design-patterns,Rest,Design Patterns,如何为使用工厂方法模式创建对象的类设计RESTful API 假设您拥有班级护照: public class Passport { final String firstName; final String lastName; final Date birthDate; State state; private Passport(State state, String firstName, String lastName, Date birthDate) {

如何为使用工厂方法模式创建对象的类设计RESTful API

假设您拥有班级护照:

public class Passport {
   final String firstName;
   final String lastName;
   final Date   birthDate;
   State  state;

   private Passport(State state, String firstName, String lastName, Date birthDate) {
      this.state = state;
      this.firstName = firstName;
      this.lastName = lastName;
      this.birthDate = birthDate;
   } 


   public static Passport createPreliminary(String firstName, String lastName, Date birthDate) {
       return new Passport(PRELIMINARY, firstName, lastName, birthDate);
   }

   public static Passport createRegular(String firstName, String lastName, Date birthDate) {
       return new Passport(REGULAR, firstName, lastName, birthDate);
   }

   public void invalidate() {
      state = INVALID;
   }
}

public enum State {
    PRELIMINARY,
    REGULAR,
    EXPIRED,
    INVALID
}
可以在两种不同的状态下创建Passport实例。创建后,只能通过诸如invalidate()之类的状态转换方法以受限方式更改state属性

创建Passport资源的RESTful方式是什么?包含state属性的POST to/passport,并在服务器端检查状态是否为常规状态或初步状态,如果是非法状态,则返回错误的请求响应?或者两个不同的URL用于创建passport资源,一个用于“常规”passport,另一个用于“初步”passport

包含state属性的POST to/passport,并在服务器端检查状态是否为常规状态或初步状态,如果是非法状态,则返回错误的请求响应

这是我的选择。将一个端点添加到passports资源是最简单、最容易理解的

如果使用了另一个选项,则每次向“状态”枚举添加/更改项时,还必须更改资源结构。它只会引入不必要的复杂性,并导致API设计的灵活性降低


API应该是内部业务逻辑的抽象。如果没有必要,不要让它变得复杂和分层。

+1“你的API应该是你内部业务逻辑的抽象。如果没有必要,不要让它变得复杂和分层。”你如何在网络上实现你的需求?您可以向服务器请求一个资源,该资源将告诉您如何生成请求。服务器将使用一个表单进行响应,该表单向客户端提供一个框架,说明哪些字段和类型是必需的,并提供一个方便的提交按钮来实际执行请求。您是创建
普通
护照还是创建
初步
护照将由可能的下拉选择决定。这同样适用于任何REST应用程序。在这种情况下,可以重用HTML表单,也可以指定自己的通用媒体类型