2013-12-17 3 views
15

У меня вопрос о том, как дизайн ресурса URI с составными ключами.REST - как дизайн URI с составными клавишами?

У меня есть ресурс, называемый грузом, который имеет 4 ключа/идентификаторы: идентификатор партнера, начальный индекс, окончательный индекс и вес.

На самом деле мой ресурс был разработан, чтобы иметь инкрементный идентификатор, генерируемый базой данных, но этот подход не очень хорошо для потребителей API, например, если потребитель/партнер должен обновить грузовую информацию, которую они должны сделать:

?

GET грузовой initialZipcode = {VALUE} & finalZipcode = {VALUE} & вес = {VALUE}

отклик операции выше будет груз ID, так что, наконец, они могут обновить информацию:

PUT фрахт/{ID}

Идентификатор партнера подразумевается механизмом аутентификации.

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

Так что мой вопрос: как я могу создать этот URI?

PUT грузовой/initialZipcode/{VALUE}/finalZipCode/{VALUE}/вес/{VALUE}

ли я рассмотреть вопрос о разработке выше?

Другой вопрос: является ли хорошая практика встроенным партнером в механизм аутентификации? Я знаю плюсы (простые для потребителей) и минусы (кеш, невозможность обмена URI и т. Д.), Но я не знаю, является ли вообще хорошей или плохой практикой.

Спасибо!

ответ

12

Там нет ничего плохого с

PUT freight?initialZipcode={VALUE}&finalZipcode={VALUE}&weight={VALUE} 

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

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

Единственная проблема заключается в том, что делать, когда клиент повторно упорядочивает параметры запроса. Вы относитесь к нему как к одному и тому же ресурсу, или вы 404? Если вы не кешируете ответы GET, это, вероятно, не имеет значения.

Если вы предоставили своему клиенту шаблон URI для их заполнения, то есть меньше шансов, что они дадут вам параметры в неправильном порядке.


Другой вариант, если вы идете с оригинальным предложением в том, что ваш GET возвращает редирект и расположение заголовка к URI с грузовым ID. например

GET freight?initialZipcode={VALUE}&finalZipcode={VALUE}&weight={VALUE} 
=> 
302 See Other 
Location: freight/1232321322 

Делая это, ваш клиент не должен ничего знать о грузовых ID, он может просто захватить заголовок местоположения, а также следить за редирект сделать GET, или сделать PUT непосредственно против любой URI находится в заголовке Location.Это означает, что если вы решите, что вам не нравится выставлять идентификатор в будущем, вы можете изменить URI, не нарушая никаких клиентов.

+0

Привет, Даррел, спасибо за ваш ответ. Для меня ваш (первый) подход кажется странным, потому что всегда я использую концепцию ID, которую я использую не как параметр запроса, как вы показали. Для меня параметры запроса определяют дополнительные параметры в определенном ресурсе, такие как: фильтр, поиск, сортировка, разбивка на страницы и т. Д. У меня есть другие случаи в моем API для обновления ресурса, и во всех случаях я использовал идентификатор в URI (параметр пути), поэтому, если у меня есть другой случай, когда обновление связано с параметрами, мне кажется, что я нарушаю концепцию унифицированного интерфейса. Я ошибаюсь? – Krock

+4

@Krock RFC 3986 утверждает, что параметры запроса являются частью идентификации ресурса. Это не дополнительные метаданные. Это было разъяснение, сделанное в предыдущей версии спецификации URI. http://tools.ietf.org/html/rfc3986#section-3.4 Клиент должен обрабатывать весь URI как непрозрачный идентификатор. –

+1

Вы меня убедили :) Но в случае создания нового фрахта? Как я могу вернуть ответ? С идентификатором ответ будет «местоположением» для созданного фрахта (например, фрахт/идентификатор), но если у меня нет идентификатора, то какой ответ? Место для перевозки? InitialZipcode = {VALUE} & finalZipcode = {VALUE} & weight = {VALUE}? – Krock

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