1

所以,我要加快速度在泽西岛,并有一个“最佳实践”的问题。应将资源自包含在一个文件中的严格程度。如果需要,一个资源类是否应该引用另一个类?

一个例子:

我有一个人员资源和一个约会资源。(即:/Person/1 & /appointment/12345)。我还可以执行 /Person/1/Appointments 之类的操作来列出第 1 个人的所有约会。

所以,我的问题是我应该在 Person Resource 类中实现一个方法 getPersonAppointments(),还是只是有人获得对 Appointment 资源类的引用并调用该方法,将所有返回“Appointments”的方法保持在一起。

我不知道有对还是错的方式。

4

3 回答 3

1

由于一个约会有多个人,一个人有多个约会,情况是对称的,你必须突破 Person 和 Appointments 之间的障碍。

于 2011-01-19T23:18:37.173 回答
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 加载约会。

于 2012-12-03T12:56:46.957 回答
0

您的 REST API 应该简化对资源的访问。REST 的原则之一是“超媒体作为应用程序状态引擎”的思想,它更喜欢通过 URI 将客户端引导到相关资源,这样客户端就不需要知道如何为某些资源构建 URI。先验的。

更多信息在这里:http ://en.wikipedia.org/wiki/HATEOAS

对 /person/1 的请求应返回有关该人的信息,包括约会 URI 的集合。然后,客户端可以请求这些 URI 中的任何一个来获取有关每个约会的信息。实施 /person/1/appointments 是多余的。

于 2011-05-17T03:01:56.033 回答