Как создать URI для службы RESTful, которая оперирует древовидными данными? - PullRequest
4 голосов
/ 25 мая 2011

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

Так, как я могу создать URI для службы RESTful?Я пробовал несколько раз, но все решения выглядят не очень хорошо для меня.

Например, если у меня есть ресурс «папка», на который ссылается URI `http://example.com/rest/here_path_to_folder,, как я могу перечислить элементы папки?Извлечь «файл» из этой папки?

Я видел документы Amazon AWS, они используют не очень чистый подход - передача пути «папки» и разделителя папок в качестве аргументов запроса, это может вызвать неоднозначность, потому что разные URI будутСсылка на тот же ресурс.Также я попытался добавить ключевые слова в конец пути, поэтому список «файлов» выглядел так:

GET /rest/path/to/folder:list HTTP/1.1

Переименовать:

POST /rest/path/to/folder:rename?target=NEW_NAME HTTP/1.1

Но это все равно выглядит ужасно для меня.Итак, знаете ли вы истории успеха использования 100% REST для иерархических данных?

1 Ответ

2 голосов
/ 26 мая 2011

Я думаю, что должно быть довольно просто использовать URI для представления вашей иерархической структуры данных.Хотя URI не подразумевают строго иерархию (некоторым людям нравится сохранять полностью непрозрачными), значимые URI имеют естественное иерархическое представление, и они должны красиво отображаться в вашем примере файла / папки.

В системе RESTful,ресурсы имеют общий интерфейс, который (в вашем случае) определяется глаголами HTTP.URI идентифицирует ресурс, а REST указывает, что его нельзя использовать для указания операции, которую вы пытаетесь выполнить.

Поэтому вместо

GET /rest/path/to/folder:list HTTP/1.1

Iпредложил бы, чтобы список содержимого папки (узнать ее состояние) вы просто используете:

GET /rest/path/to/folder HTTP/1.1

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

GET /rest/path/to/folder/myfile HTTP/1.1

Переименование немного сложнее.В некоторых случаях DELETE, за которым следует PUT, будет работать, но я предполагаю, что вы хотите сохранить содержимое папки без необходимости повторной загрузки.Одним из вариантов является PUT, где тело содержит новый путь к папке, который отвечает 204 и значением заголовка Location, указывающим на вновь созданную папку (как описано в «Переименовании тега» здесь ).Необязательно: Если вы хотите быть по-настоящему дружелюбным по отношению к своим пользователям, вы также можете вернуть статус 301 (навсегда перенесенный) со ссылкой на новый URI, если кто-либо сделает запрос на старый URI.

ЗапомнитеПуть - это только одно из свойств, определяющих состояние папки, вы можете обновить это состояние с помощью PUT, не вводя пользовательскую операцию переименования.В вашем случае вы используете путь для определения вашего URI, но вполне допустимо, чтобы изменение состояния вызывало изменение URI.

...