所以,我正准备加速泽西岛并提出“最佳实践”问题。如何严格保持资源自包含在一个文件中。如果需要,一个资源类是否应引用另一个类?
一个例子:
我有一个Person资源和一个约会资源。 (即:/ Person / 1& / appointment / 12345)。我也可以像/ Person / 1 / Appointments那样列出人1的所有约会。
所以,我的问题是我应该在Person Resource类中实现一个方法getPersonAppointments(),或者只是有人获得对Appointment资源类的引用并调用该方法,保留所有返回“约会”的方法。 / p>
我不知道有正确或错误的方式。
答案 0 :(得分:1)
由于约会有多个人,并且一个人有多个约会,因此情况是对称的,您必须在人员和约会之间穿越障碍。
答案 1 :(得分:0)
您的REST API应简化对资源的访问。 REST的原则之一是“超媒体作为应用程序状态引擎”的概念,它倾向于通过URI将客户端引导到相关资源,以便客户端不需要知道如何构造到某些资源的URI。先验。
有关详情,请访问:http://en.wikipedia.org/wiki/HATEOAS
对/ person / 1的请求应返回有关该人的信息,包括约会URI的集合。然后,客户端可以请求任何这些URI以获取有关每个约会的信息。实施/ person / 1 /约会是多余的。
答案 2 :(得分:0)
在你的场景中,我会将用于加载人员约会的逻辑放在一个资源中,并使其可以从另一个资源访问(换句话说,委托资源,我假设你已经在做什么)。实际逻辑存储在AppointmentService中,因此您可以将它与getPersonAppointments()一起使用。
这样你就可以调用它:
两者都产生相同的响应。 这可能不是最佳实践,但逻辑在一个地方,使其更具可读性和可重用性。
@Path("person")
public class PersonResource {
@GET
@Path("{personId: [0-9]+}/appointments")
public AppointmentsResource loadAppointmentsForPerson(@PathParam("personId") Long personId) {
return new AppointmentsResource(personId);
}
}
@Path("apointments")
class AppointmentResource {
private AppointmentService service;
private Long personId;
public AppointmentResource() {
}
public AppointmentResource(Long personId) {
this.personId = personId;
}
@GET
public Response loadAppointmentsForPerson(@QueryParam("personId") Long personId) {
Long personIdToUse = null;
if (this.personId != null) {
personIdToUse = this.personId;
} else if (personId != null) {
personIdToUse = personId;
} else {
//no input, bad request
}
List<Appointment> appointments = service.getPersonAppointments(personIdToUse)
//create your response from appointments
}
}
当然,在您的AppointmentResource中,您将拥有其他内容,例如按特定ID加载约会。