Существуют очевидные дубликаты для некоторых основных операций файловых систем (например. ls
и rm
), но как Вы реализовали бы не прямо УСПОКОИТЕЛЬНЫЕ действия такой как cp
или mv
?
Как отвечает на вопрос, Как реализовать вставку копии ресурса в REST? предложите, предпочтительный способ реализовать cp
включал бы Получение ресурса, УДАЛЕНИЕ его и Откладывание он снова с новым именем.
Но что, если я должен был бы сделать это эффективно? Например, если размер ресурса был бы огромен? Как я устранил бы лишнюю передачу полезной нагрузки ресурса клиенту и назад к инициирующему серверу?
Вот иллюстрация. У меня есть ресурс:
/videos/my_videos/2-gigabyte-video.avi
и я хочу, копируют его в новый ресурс:
/videos/johns_videos/copied-2-gigabyte-video.avi
Как я реализовал бы копию, переместитесь или другие действия файловой системы УСПОКОИТЕЛЬНЫЙ путь? Или есть ли даже надлежащий путь? Я делаю все это неправильно?
[...предпочтительный способ реализации cp будет включать получение ресурса, удаление его и размещение его снова с новым именем.]
Одной из проблем вышеупомянутого подхода является отсутствие атомарности и согласованности. Поскольку каждая из операций (GET, DELETE и PUT) происходит по протоколу HTTP (который по своей сути является безэталонным), сервер не может обеспечить атомарность. По любой причине клиент может прерваться после любого шага до последнего шага, и это оставит сервер с непоследовательным состоянием его данных.
Возможный подход:
HTTP/1. 1 201 Created
Content-type:video/x-msvideo
Location:/videos/johns_videos/8765
Примечание: Я предпочитаю отправлять ID обратно и работать с идентификаторами ресурсов, а не что-то вроде
Location: /videos/johns_videos/copied-2-gigabyte-video.avi
Операция Move довольно похожа, за исключением того, что сервер может принять ресурс назначения. Пример:
http://example.com//videos/johns_videos/8765/move?destination=[destination]
Вы можете расширить вышеописанный подход таким образом, что сервер посылает клиенту тег Last-Modified, а клиент посылает его вместе с запросом. Сервер будет выполнять операции копирования/перемещения только тогда, когда это значение все еще согласовано. Это позволит решить проблемы параллелизма, когда ресурс изменяется, а операции копирования/перемещения все еще выполняются.
Вы можете открыть новую службу, которая принимает (POST) простой XML-документ, в котором описывается, что вы хотите сделать.
<move>
<target>/videos/my_videos/2-gigabyte-video.avi</target>
<destination>/videos/johns_videos/copied-2-gigabyte-video.avi<destination>
<move>
Затем эта служба могла бы вернуть URI, по которому клиент может перейти и проверить статус операции. Затем клиент может взаимодействовать с этим новым ресурсом, чтобы сказать отменить перемещение, если оно еще не завершено, или проверить его успешность.
Один из способов сделать это - сформулировать ваши запросы PUT/POST таким образом, чтобы вы могли либо передать фактические данные, либо URL ресурса, возможно, с возможностью сделать жесткую или символическую ссылку. Если указанный URL размещен на вашей собственной системе, то вы можете просто указать внутреннюю ссылку на тот же файл, возможно, сохранив бит для "копирования при записи" или что-то в этом роде, чтобы сделать это эффективным.
На мой взгляд, видео - это ресурс. Итак, у этого ресурса есть путь. что, если вы выполните ОБНОВЛЕНИЕ, которое изменит путь к ресурсу?
Затем в вашем коде, если он изменит путь, вам просто нужно переместить файл.
REST не ограничивается HTTP! Лучше всего использовать webdav для решения вашей проблемы.