2014-10-30 2 views
0

Скажем, у нас есть следующий ресурс сервера:REST API с помощью GET Params

api.example.com/event/1 

который возвращает некоторый произвольный ресурс, скажем:

{ 
    id: 1, 
    details: { 
     type: 'webinar', 
     .... 
    }, 
    attendees: [ 
     { 
      user_id: 1, 
      first_name: 'Bob' 
      ... 
     }, 
     ... 
    ] 
} 

Это может быть полезным для клиента, чтобы сделать запрос получите только информацию о событии, но не список участников.

Лучше ли предоставить два отдельных URL-адреса ресурсам и заставить два отдельных запроса, если клиент хочет оба ресурса?

api.example.com/event/{event_id} 
api.example.com/attendees/{event_id} 

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

api.example.com/event/{event_id}?listAttendees={true|false} 
api.example.com/attendees/{event_id} 

Если параметр listAttendees либо иметь представление возвращает список участников или нет.

Общепринятой практикой является позволить параметрам GET изменять представление, возвращаемое с определенного URL-адреса?

+0

Был ли клиент когда-либо нужен только список участников без сведений о мероприятии? – Centinul

+0

Я бы выбрал два разных URS, которые полностью совпадают с REST, и вы запрашиваете два разных ресурса, которые могут быть идентифицированы двумя разными URI. –

+0

@Centinul, вы можете захотеть кэшировать сведения о мероприятии и список посетителей по-разному. Если, например, информация о мероприятии не изменится, но список участников может. – moesef

ответ

0

Я бы сказал, что самый правильный способ сделать это в REST будет с разными типами мультимедиа или параметрами медиа-типа, но поскольку большинство людей не используют пользовательские типы мультимедиа, я часто использую то, что я называю протокол масштабирования. Идея заключается в том, что у вас есть параметр или expand с числовым значением, и он рекурсивно включает дочерние объекты, уменьшая параметр до тех пор, пока он не достигнет нуля.

Таким образом, запрос, как:

GET api.example.com/event/1 

Возвращает простое представление для ресурса событий, не внедряя ничего. Запрос, такой как:

GET api.example.com/event/1?zoom=1 

Включает непосредственных детей мероприятия, в вашем случае, участников. В связи с этим:

GET api.example.com/event/1?zoom=2 

Включает в себя непосредственных детей мероприятия, непосредственных детей участников.

Чтобы ответить на ваш вопрос, в REST весь URI является атомарным идентификатором, поэтому параметры являются частью URI. Это может быть проблемой, если вы используете то, что не будет интерпретировать URI таким же образом, как старые серверы кеша, которые не будут кэшировать URI с помощью строки запроса.

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