2017-01-20 39 views
0

Я пытаюсь создать запрос GET, где у меня есть два разных запроса. Поскольку оба ресурса связаны друг с другом, я пытаюсь поставить их под один «под-ресурс». Первый:Несколько ресурсов по одному запросу: шаблон дизайна RESTful API

@QueryParam("{customerId}") 
    public List<customerModel> getCustomer(@QueryParam("customerId") Long customerId) {....} 

это получает имя клиента в зависимости от CUSTOMERID

@QueryParam("{customerId}/details") 
public List<customerDetailModel> getCustomerDetail(@QueryParam("customerId") Long customerId) {....} 

это получает подробную информацию о клиенте (номер телефона, адрес и т.д.)

Я запускаю первый со следующим (работает отлично): ......? CustomerId = 7453112

, но я не могу обратитесь ко второму запросу, когда я нахожу следующий URL: ......? customerId = 7453112/подробности

Любые предложения?

ответ

0

методы ресурсов должны быть аннотированный с @Path и с методом запроса обозначения, такие как @GET, @POST, @PUT, @DELETE, @HEAD или @OPTIONS. Ваша аннотация @QueryParam неуместна.

Кстати, в этой ситуации, вы должны рассмотреть возможность использования параметра пути вместо запроса параметра. Следовательно, вы должны использовать @PathParam вместо @QueryParam в параметре метода. Более подробную информацию о том, когда использовать параметры запроса или пути, см. Здесь. answer

Также не знаете, почему вы возвращаете List, если вы запрашиваете ресурс по его уникальному идентификатору. В этой ситуации вы должны вернуть представление одного ресурса (а не представления нескольких ресурсов).

Так ваш класс ресурс будет выглядеть следующим образом:

@Path("customers") 
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) 
public class CustomerResource { 

    @GET 
    @Path("{customerId}") 
    public CustomerModel getCustomer(@PathParam("customerId") Long id) { 
     ... 
    } 

    @GET 
    @Path("{customerId}/details") 
    public CustomerDetailModel getCustomerDetail(@PathParam("customerId") Long id) { 
     ... 
    } 
} 

Первая точка может быть запрошено следующим образом:

GET http://example.com/api/customers/1 

И вторая точка может быть запрошено следующим образом:

GET http://example.com/api/customers/1/details 
0

Вам нужно пойти с @RequestMapping.

Нечто вроде: @RequestMapping("/{customerId}") и @RequestMapping("/{customerId}/details").

Ваш URL-адрес становится 7453112/details вместо параметров запроса.

+0

'@ RequestMapping' - это аннотация для Spring. OP использует JAX-RS. –

+0

Извините, упустил тег, и он был давно, так как я работал с Spring, поэтому они являются новыми аннотациями. –

0

Вы можете указать /details в @Path аннотацию, а затем использовать один и тот же параметр запроса, например:

@Path("/details/{customerId}") 
public List<customerDetailModel> getCustomerDetail(@PathParam("customerId") Long customerId) {....} 

Тогда ваш URL будет выглядеть следующим образом:

.../details/7453112

Или если вы хотите продолжать использовать его в качестве параметра запроса, вы можете сделать что-то вроде этого:

@Path("/details") 
public List<customerDetailModel> getCustomerDetail(@QueryParam("customerId") Long customerId) {....} 

с помощью этого URL:

.../details?customerId=xxx

+0

В этом конкретном случае, какова должна быть «лучшая практика»? Я имею в виду, должен ли он быть только PathParam или должен быть QueryParam? – Aiguo

+0

Я думаю, потому что идентификатор клиента является предметом функциональности метода, имеет смысл использовать его в качестве параметра запроса. Здесь есть хороший вопрос: http://stackoverflow.com/questions/11552248/when-to-use-queryparam-vs-pathparam –

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

  • Нет связанных вопросов^_^