工厂方法设计模式的RESTful实现
如何为使用工厂方法模式创建对象的类设计RESTful API 假设您拥有班级护照:工厂方法设计模式的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) {
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表单,也可以指定自己的通用媒体类型