2015-02-20 2 views
0

Я пытаюсь создать API для своих служб Rest, и я борюсь с правилами проектирования, которые я пытаюсь выполнить. В обычно я пытаюсь следовать (среди прочих) эти рекомендации:Rest 'guidelines' затрудняет разработку API

  1. Не используйте глаголы в URIs
  2. Не использовать параметры запроса при изменении состояния
  3. Использование множественного числа
  4. Дон» т использование верблюд случай

Теперь я должен моделировать что-то вроде следующего:

  • Получить все отделы компании
  • Получить отдел компании
  • Удалить все deprtaments от компании
  • Удалить отдел компании

Я пытаюсь что-то вроде этого:

GET company/departments 
GET company/departments/<depName> 
DELETE company/departments 
DELETE company/departments {body: department name} 

Вышеприведенные вышеприведенные рекомендации, которые я упомянул, но я действительно не думаю, что приведенные URI хороши. Особенно четвертый, выполняет другую работу и имеет тот же URI, что и третий.

Это распространенная проблема для меня, и я встречаюсь с ней много раз, когда я занимаюсь проектированием служб REST. В результате я всегда нарушаю некоторые принципы проектирования, чтобы добиться того, чего я хочу или сделать более уродливые URI (например: DELETE company/department/department).


Так фактический вопрос:

В моей конструкции, как я могу удалить один отдел с Restfull-как URI?

ответ

3

URL-адрес состоит из нескольких частей:

http://example.com/company/departments/12345?arg1=this&arg2=that 

http: является схема. //example.com является хозяином. /company/departments/12345 - это путь, ?arg1=this&arg2=that - строка запроса, состоящая из двух параметров: arg1 и arg2. Есть еще один аспект, называемый матричными аргументами, который здесь не обсуждается.

Когда REST говорит о URL-адресах, это относится ко всему. Не часть его. Для ОТДЫХА весь URL-адрес рассматривается как непрозрачный blob.

Это означает, что REST не заботится ни о какой конкретной части: схеме, хосте, пути или аргументах.

ftp://127.0.0.1/E280F814-1524-41D5-8735-43D8414AE242 - это совершенно прекрасный URL-адрес, что касается REST.

Что касается REST, это не дает разрывать путь, который вы используете в своем URL-адресе, или используете ли вы параметры или нет.

При этом рекомендации по параметрам в URL-адресе состоят в том, что иногда кэши не кэшируют параметризованные URL-адреса должным образом. Таким образом, предпочтение отдается /company/department/12345 по сравнению с /company/department?id=12345.

12345 в пути не параметр. Его имя ресурса. Точно так же, как starwars.mp4 выше не является параметром, равно E280F814-1524-41D5-8735-43D8414AE242. Это просто имена. Единственными людьми, которые действительно заботятся, являются люди. На компьютере все равно, в интернете все равно, REST не волнует. Для них это всего лишь бит.

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

+0

ой, я вижу ... спасибо! этот ответ покрыл меня. – Mario

4

Лучшим дизайном для URI RESTful является использование идентификатора ресурса. В этом случае ресурсом является отдел.

Так что ваши идентификаторы URI может быть как следующее:

GET company/departments 
GET company/departments/<department-id> 
DELETE company/departments 
DELETE company/departments/<department-id> 

Например ...

DELETE company/departments/58491 

С помощью идентификатора, а не название отдела, это позволяет избежать пробелов в ваших URIs, что нежелательно. По имени отдела, я предполагаю, что вы имели в виду удобное отображаемое имя, например «Управление человеческим капиталом».

+0

Это то, что я хочу сделать, но, делая это, я нарушить довольно важное правило: "польза 2.Do параметров запроса при изменении состояния. Я ошибаюсь? – Mario

+0

Параметр '/ 58491' не является параметром запроса. DELETE компания/подразделения? Id = 58491 - это параметр запроса. –

+0

, но это все еще параметр в URL-адресе (возможно, я не должен использовать термин «параметр запроса»). В общем, я стараюсь следовать правилам, которые я собрал, но есть слишком ограничительные. Вы думаете, я не должен воспринимать их слишком serius? – Mario

0

Согласен. Чтобы удалить отдел, вы должны использовать URL-адрес, как показано ниже. Такой URL-адрес идентифицирует отдел и может использоваться для выполнения HTTP-операций. Не указывайте идентификатор или имя отдела в пределах полезной нагрузки запроса.

DELETE company/departments/58491 

Следующая ссылка может дать вам некоторые подробности о разработке RESTful услуги: https://templth.wordpress.com/2014/12/15/designing-a-web-api/.

Надеется, что это помогает вам, Thierry

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