Насколько я могу судить, каждый отдельный ресурс должен иметь только один канонический путь. Итак, в следующем примере, какими будут хорошие шаблоны URL?
Возьмем для примера представительство отдыхающих компаний. В этом гипотетическом примере каждой компании принадлежит 0 или более отделов, а каждому отделу принадлежит 0 или более сотрудников.
Отдел не может существовать без ассоциированной компании.
Сотрудник не может существовать без ассоциированного отдела.
Теперь я нашел бы естественное представление шаблонов ресурсов.
/companies
Коллекция компаний - Принимает положил для новой компании. Получи за всю коллекцию./companies/{companyId}
Индивидуальная компания. Принимает GET, PUT и DELETE/companies/{companyId}/departments
Принимает POST для нового элемента. (Создает отдел внутри компании.)/companies/{companyId}/departments/{departmentId}/
/companies/{companyId}/departments/{departmentId}/employees
/companies/{companyId}/departments/{departmentId}/employees/{empId}
Учитывая ограничения, в каждом из разделов я чувствую, что это имеет смысл, если немного глубоко вложен.
Однако моя проблема возникает, если я хочу перечислить ( GET
) всех сотрудников во всех компаниях.
Шаблон ресурсов для этого наиболее точно соответствует /employees
(Коллекция всех сотрудников)
Означает ли это, что я должен иметь /employees/{empId}
также потому, что если так, то есть два URI, чтобы получить тот же ресурс?
Или, может быть, вся схема должна быть сведена, но это будет означать, что сотрудники являются вложенным объектом верхнего уровня.
На базовом уровне /employees/?company={companyId}&department={deptId}
возвращается точно такое же представление о сотрудниках, как и наиболее глубоко вложенный шаблон.
Какова оптимальная практика для шаблонов URL, когда ресурсы принадлежат другим ресурсам, но должны обрабатываться отдельно?
источник
Ответы:
То, что вы сделали, правильно. В целом, к одному и тому же ресурсу может быть много URI - не существует правил, запрещающих это делать.
И вообще, вам может понадобиться получить доступ к элементам напрямую или как к подмножеству чего-то еще - так что ваша структура имеет смысл для меня.
Только потому, что сотрудники доступны в отделе:
company/{companyid}/department/{departmentid}/employees
Это не значит, что они не могут быть доступны и в компании:
company/{companyid}/employees
Который вернул бы сотрудников для этой компании. Это зависит от того, что нужно вашему потребителю - это то, для чего вы должны разрабатывать.
Но я надеюсь, что все обработчики URL-адресов используют один и тот же код поддержки для удовлетворения запросов, чтобы вы не дублировали код.
источник
/company/3/department/2/employees/1
). Если API предоставляет способы получить каждый ресурс, то выполнение каждого из этих запросов может быть выполнено либо в библиотеке на стороне клиента, либо в виде одноразовой конечной точки, которая повторно использует код./company/*
должен только возвращать ресурс компании и не изменять тип ресурса вообще. Ничто из этого не указано в REST - обычно это плохо указано - просто личное предпочтение.Я испробовал обе стратегии проектирования - вложенные и не вложенные конечные точки. Я нашел это:
если у вложенного ресурса есть первичный ключ, а у вас нет его родительского первичного ключа, то вложенная структура требует его получения, даже если система фактически не требует его.
вложенные конечные точки обычно требуют избыточных конечных точек. Другими словами, вам чаще всего понадобится дополнительная конечная точка / employee, чтобы вы могли получить список сотрудников по отделам. Если у вас есть / сотрудники, что именно / компании / отделы / сотрудники покупают вам?
Вложенные конечные точки развиваются не так хорошо. Например, вам может не понадобиться искать сотрудников сейчас, но вам может потребоваться позже, и если у вас есть вложенная структура, у вас нет другого выбора, кроме как добавить другую конечную точку. С не вложенным дизайном вы просто добавляете больше параметров, что проще.
иногда ресурс может иметь несколько типов родителей. В результате все конечные точки возвращают один и тот же ресурс.
избыточные конечные точки затрудняют написание документов, а также затрудняют изучение API.
Короче говоря, не вложенный дизайн, кажется, допускает более гибкую и более простую схему конечных точек.
источник
Я переместил то, что сделал, с вопроса на ответ, где больше людей, вероятно, увидят это.
Я сделал так, чтобы конечные точки создания находились во вложенной конечной точке. Каноническая конечная точка для изменения или запроса элемента не находится во вложенном ресурсе .
Так что в этом примере (просто перечисление конечных точек, которые изменяют ресурс)
POST
/companies/
создает новую компанию, возвращает ссылку на созданную компанию.POST
/companies/{companyId}/departments
когда отдел помещен, создается новый отдел возвращает ссылку на/departments/{departmentId}
PUT
/departments/{departmentId}
изменяет отделPOST
/departments/{deparmentId}/employees
создает нового сотрудника возвращает ссылку на/employees/{employeeId}
Таким образом, есть ресурсы корневого уровня для каждой из коллекций. Однако создание находится в владеющем объекте.
источник
POST
смыслPUT
, и в противном случае.Я прочитал все приведенные выше ответы, но, похоже, у них нет общей стратегии. Я нашел хорошую статью о передовых практиках в API проектирования от Microsoft Documents . Я думаю, что вы должны обратиться.
,
источник
То, как выглядят ваши URL, не имеет ничего общего с REST. Все идет. На самом деле это «деталь реализации». Так же, как вы называете свои переменные. Все они должны быть уникальными и долговечными.
Не тратьте слишком много времени на это, просто сделайте выбор и придерживайтесь его / будьте последовательны. Например, если вы используете иерархию, вы делаете это для всех своих ресурсов. Если вы идете с параметрами запроса ... и т. Д., Так же, как соглашения о присвоении имен в вашем коде.
Почему так ? Насколько я знаю, API "RESTful" должен быть доступен для просмотра (вы знаете ... "Гипермедиа как движок состояния приложения"), поэтому клиент API не заботится о том, на что похожи ваши URL, пока они действительный (нет SEO, нет человека, который должен читать эти "дружеские ссылки", кроме как для отладки ...)
То, насколько приятный / понятный URL-адрес в REST API, интересует вас, как разработчика API, а не клиента API, как было бы имя переменной в вашем коде.
Самое главное, чтобы ваш клиент API знал, как интерпретировать ваш тип мультимедиа. Например, он знает, что:
Ниже приведен пример обмена HTTP (тела в yaml, так как их легче написать):
Запрос
Ответ: список ссылок на основной ресурс (компании, люди, что угодно ...)
Запрос: ссылка на компании (используя body.links.companies предыдущего ответа)
Ответ: неполный список компаний (по пунктам), ресурс содержит связанные ссылки, например ссылку, чтобы получить следующую пару компаний (body.links.next), другую (шаблонную) ссылку для поиска (body.links.search)
Таким образом, как вы видите, если вы идете по пути ссылок / отношений, то, как вы структурируете часть пути ваших URL, не имеет никакого значения для вашего клиента API. И если вы сообщаете клиенту структуру ваших URL-адресов в качестве документации, то вы не выполняете REST (или, по крайней мере, не уровень 3 в соответствии с « моделью зрелости Ричардсона »)
источник
Я не согласен с таким путем
Если вы хотите получить отделы, я думаю, что лучше использовать ресурс / отделы
Я предполагаю, что у вас есть
companies
таблица и таблица, аdepartments
затем классы для отображения их на языке программирования, который вы используете. Я также предполагаю, что отделы могут быть присоединены к другим объектам, а не к компаниям, поэтому ресурс / отделы прост, удобно сопоставлять ресурсы с таблицами, а также вам не нужно столько конечных точек, так как вы можете повторно использоватьдля любого вида поиска, например
Если вы хотите создать отдел,
должен использоваться ресурс, а тело запроса должно содержать идентификатор компании (если отдел может быть связан только с одной компанией).
источник
GET /companies/{companyId}?include=departments
, поскольку это позволяет извлекать и компанию, и ее отделы в одном HTTP-запросе. Фрактал делает это действительно хорошо./departments
конечной точке только для администратора, и каждая компания будет иметь доступ к своим собственным отделам только через `/ companies / {companyId} / департаменты`Rails предоставляет решение этой проблемы: мелкое вложение .
Я думаю, что это хорошо, потому что когда вы работаете непосредственно с известным ресурсом, нет необходимости использовать вложенные маршруты, как обсуждалось в других ответах здесь.
источник