泽西资源类互动?

时间:2010-02-04 04:32:47

标签: java jersey

所以,我正准备加速泽西岛并提出“最佳实践”问题。如何严格保持资源自包含在一个文件中。如果需要,一个资源类是否应引用另一个类?

一个例子:

我有一个Person资源和一个约会资源。 (即:/ Person / 1& / appointment / 12345)。我也可以像/ Person / 1 / Appointments那样列出人1的所有约会。

所以,我的问题是我应该在Person Resource类中实现一个方法getPersonAppointments(),或者只是有人获得对Appointment资源类的引用并调用该方法,保留所有返回“约会”的方法。 / p>

我不知道有正确或错误的方式。

3 个答案:

答案 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()一起使用。

这样你就可以调用它:

  • /人/ 1 /约会
  • /预约?PERSONID = 1

两者都产生相同的响应。 这可能不是最佳实践,但逻辑在一个地方,使其更具可读性和可重用性。

@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加载约会。