Я - нуб REST, пытаюсь спроектировать мою первую схему REST API.
Рассмотрим простой REST API для перечисления / просмотра / редактирования / удаления пользовательских объектов. Мы могли бы использовать следующие 2 шаблона URL для маршрутизации:
/users # GET returns a list of users, POST allows creation of new user
/users/{userid} # GET returns user info, PUT for updating user info, DELETE to delete user
Пока все хорошо. Теперь предположим, что пользователи могут быть расположены во вложенных папках. Таким образом, пользователь теперь может находиться внутри папки, а папка может содержать как пользователей, так и подпапки. Чтобы разрешить управление папками, мы хотим добавить следующие функции в наш API:
- Список содержимого (пользователи и подпапки) папки
- Создать новую папку
- Переименование, удаление папок
- Переместить пользователя или подпапку в другую родительскую папку
Каков наилучший способ предоставления этой функциональности в REST API? Я придумал две идеи:
Идея 1: Показать иерархию папок в URL
например. /users/folder1/folder2/chris
На первый взгляд это выглядит красиво, но с этим подходом есть ряд проблем:
У пользователей и папок теперь один и тот же шаблон URL. Невозможно узнать, указывает ли /users/a/b/c
на пользователя или папку. Это делает трудным для понимания API и раздражающей реализацией, включающей ручной анализ URL-адресов и догадки.
Когда клиент отправляет POST
на /users/folder1
, мы не знаем, хотят ли они создать нового пользователя или новую подпапку. Их нужно будет указать в теле запроса. Опять же, это приводит к раздражающей реализации на стороне сервера и выглядит не очень RESTful.
Нет очевидного способа разрешить перемещение ресурсов из одной папки в другую
Идея 2: Добавить информацию о родительской папке в ресурс
Сохраните простые шаблоны URL, показанные выше, и добавьте поле parentFolder
к пользовательскому ресурсу.
например. GET
до /users
могут возвращаться (в JSON):
{'users':
[{'name':'chris','DoB':'1/1/1900','parentFolder':'/folder1/folder2'},
...]
}
Добавление отдельного шаблона URL /folders
и /folders/{folderid}
для просмотра / редактирования / удаления папок.
Это решает некоторые проблемы с Idea 1, но с точки зрения дизайна это делает меня неловким:
Добавление родителя ресурса в качестве атрибута ресурса кажется странным.
Почему мы должны разделять пользователей и их папки на отдельные API-интерфейсы, даже если они явно взаимосвязаны?
Спасибо, что прочитали это далеко. Есть ли лучший способ справиться с этим?