2010-02-04 14 views
1

Итак, я приступаю к скорости на Джерси и задаю вопрос «лучшей практики». Насколько строго следует хранить ресурсы самостоятельно в одном файле. Должен ли один класс ресурсов ссылаться на другой класс, если это необходимо?Взаимодействие ресурсов класса «Ресурс»?

Пример:

У меня есть ресурс Person и ресурс Назначение. (т.е.:/Лицо/1 &/назначение/12345). Я также могу сделать что-то вроде/Person/1/Назначения, чтобы перечислить все встречи для человека 1.

Итак, мой вопрос заключается в том, должен ли я реализовать метод getPersonAppointments() в классе Person Resource или просто получить ссылку к классу ресурсов Назначения и вызовите этот метод, сохраняя все методы, которые возвращают «Назначения» вместе.

Я не знаю, что есть правильный или неправильный способ.

ответ

1

Поскольку в назначении есть несколько человек, и у человека есть несколько назначений, ситуация симметрична, и вы должны пробивать барьер между Лицами и Назначениями.

0

Ваш API REST должен упростить доступ к ресурсам. Одним из принципов REST является идея «Hypermedia as Engine of Application State», которая предпочитает направлять клиентов к связанным ресурсам с помощью своих URI, чтобы клиент не нуждался в том, чтобы создавать URI для определенных ресурсов. априори.

Более подробную информацию о том, что здесь: http://en.wikipedia.org/wiki/HATEOAS

Запрос на/человек/1 должен возвратить информацию об этом человеке, в том числе коллекцию назначения URI. Затем клиент может запросить любой из этих URI для получения информации о каждом из этих назначений. Реализация/человек/1/назначения являются излишними.

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.

Смежные вопросы