RESTful операции копирования / перемещения? - PullRequest
6 голосов
/ 10 июня 2010

Я пытаюсь создать службу, похожую на файловую систему RESTful, и операции копирования / перемещения вызывают у меня некоторые проблемы.

Прежде всего, загрузка нового файла выполняется с использованием PUT для окончательного URL-адреса файла:

PUT /folders/42/contents/<name>

Вопрос в том, что, если новый файл уже находится в системе под другим URL-адресом?

Копирование / перемещение Идея 1 : PUT с пользовательскимизаголовки.

Это похоже на копию S3 .PUT, который выглядит так же, как при загрузке, но с настраиваемым заголовком:

PUT /folders/42/contents/<name>
X-custom-source: /files/5

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

Копирование / перемещение Идея 2 : POST в родительскую папку.

Это похоже на копию Документов Google .POST для папки назначения с содержимым XML, описывающим исходный файл:

POST /folders/42/contents
...
<source>/files/5</source>
<newName>foo</newName>

Возможно, я смогу POST к новому URL-адресу файла, чтобы изменить его имя ..?В противном случае я застрял с указанием нового имени в содержимом XML, что усиливает RPCness этой идеи.Это также не так согласуется с операцией загрузки, как идея 1.

В конечном счете, я ищу что-то, что легко использовать и понимать, поэтому в дополнение к критике вышесказанного, новые идеи, безусловно, приветствуются!

Ответы [ 5 ]

6 голосов
/ 20 февраля 2013

Для создания нового ресурса вы обычно используете POST.Это должно создать новый ресурс на URI, создаваемом сервером.

POST /folders/42/contents/fileName
<target>newFile</target>

Что REST говорит, что с POST новый ресурс находится в пути, определенном сервером.Вот как копирование работает даже в файловой системе (windows).Предположим, что вы скопировали файл в имя, которое уже существует, тогда ответ в приведенном выше примере может быть следующим:

<newFileLocation>/folders/42/contents/newFile-2</newFileLocation>

Затем выполняется перемещение, сначала скопировав, а затем удалив.Вам не следует выполнять эти два действия в одном запросе.

Редактировать:
Я нашел книгу RESTful Web Services Cookbook очень хорошо.

Глава 11 обрабатывает метод Copy и рекомендует следующее в 11.1:

Задача Вы хотите знать, как сделать копию существующего ресурса.

Решение Разработка ресурса контроллера, который может создавать копию.Клиент делает POST-запрос к этому контроллеру, чтобы скопировать ресурс.Чтобы сделать POST условным, предоставьте клиенту одноразовый URI.После того как контроллер создаст копию, верните код ответа 201 (Создан) с заголовком Location, содержащим URI копии.

Запрос POST / album / 2009/08/1011 / duplicate;t = a5d0e32ddff373df1b3351e53fc6ffb1

Ответ

<album xmlns:atom="http://www.w3.org/2005/Atom">
<id>urn:example:album:1014</id>
<atom:link rel="self" href="http://www.example.org/albums/2009/08/1014"/>
...
</album>
4 голосов
/ 14 июня 2010

REST не ограничен набором HTTP-методов по умолчанию. В этом случае вы можете использовать WebDAV.

4 голосов
/ 10 июня 2010

Спецификация HTTP говорит, что если ресурс уже существует, вы обновляете ресурс и возвращаете 200. Если ресурс не существует, вы создаете его и возвращаете 201.

Edit:
Хорошо, я неправильно прочитал. Я предпочитаю POST подходу родительской папки. Вы также можете обратиться к исходному файлу, используя параметр строки запроса. например,

POST /destination/folder?sourceFile=/source/folder/filename.txt
0 голосов
/ 24 марта 2014

Для перемещения вы можете

а).скопируйте через PUT с пользовательским заголовком источника, за которым следует УДАЛЕНИЕ на источнике.

b).УДАЛИТЬ источник с пользовательским заголовком перемещения.

Я предпочитаю последний, потому что он может быть атомарным, и клиенту ясно, что ресурс был удален из исходной коллекции.И когда он ПОЛУЧИТ коллекцию своего нового местоположения, он найдет перемещенный ресурс там.

0 голосов
/ 13 июня 2010

Для части перемещения, просто сделайте комбинацию Copy (PUT) и Delete, если вы хотите сохранить простоту

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...