Как смоделировать операции файловой системы с REST?

Существуют очевидные дубликаты для некоторых основных операций файловых систем (например. ls и rm), но как Вы реализовали бы не прямо УСПОКОИТЕЛЬНЫЕ действия такой как cp или mv?

Как отвечает на вопрос, Как реализовать вставку копии ресурса в REST? предложите, предпочтительный способ реализовать cp включал бы Получение ресурса, УДАЛЕНИЕ его и Откладывание он снова с новым именем.

Но что, если я должен был бы сделать это эффективно? Например, если размер ресурса был бы огромен? Как я устранил бы лишнюю передачу полезной нагрузки ресурса клиенту и назад к инициирующему серверу?

Вот иллюстрация. У меня есть ресурс:

/videos/my_videos/2-gigabyte-video.avi

и я хочу, копируют его в новый ресурс:

/videos/johns_videos/copied-2-gigabyte-video.avi

Как я реализовал бы копию, переместитесь или другие действия файловой системы УСПОКОИТЕЛЬНЫЙ путь? Или есть ли даже надлежащий путь? Я делаю все это неправильно?

5
задан Community 23 May 2017 в 11:52
поделиться

5 ответов

[...предпочтительный способ реализации cp будет включать получение ресурса, удаление его и размещение его снова с новым именем.]

Одной из проблем вышеупомянутого подхода является отсутствие атомарности и согласованности. Поскольку каждая из операций (GET, DELETE и PUT) происходит по протоколу HTTP (который по своей сути является безэталонным), сервер не может обеспечить атомарность. По любой причине клиент может прерваться после любого шага до последнего шага, и это оставит сервер с непоследовательным состоянием его данных.

Возможный подход:

  • Если ресурсы являются документами (а я полагаю, что в вашем случае это так), я бы рассмотрел возможность использования WebDAV.
  • Если WebDAV не является вариантом...
    • создайте объект контроллера на сервере для управления операциями копирования и перемещения, клиент может POST на что-то вроде /videos/my_videos/[video_id]/copy
    • В вашем ответе вы можете указать URI на скопированный ресурс, в строках:

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, а клиент посылает его вместе с запросом. Сервер будет выполнять операции копирования/перемещения только тогда, когда это значение все еще согласовано. Это позволит решить проблемы параллелизма, когда ресурс изменяется, а операции копирования/перемещения все еще выполняются.

3
ответ дан 14 December 2019 в 01:03
поделиться

Вы можете открыть новую службу, которая принимает (POST) простой XML-документ, в котором описывается, что вы хотите сделать.

<move>
   <target>/videos/my_videos/2-gigabyte-video.avi</target>
   <destination>/videos/johns_videos/copied-2-gigabyte-video.avi<destination>
<move>

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

1
ответ дан 14 December 2019 в 01:03
поделиться

Один из способов сделать это - сформулировать ваши запросы PUT/POST таким образом, чтобы вы могли либо передать фактические данные, либо URL ресурса, возможно, с возможностью сделать жесткую или символическую ссылку. Если указанный URL размещен на вашей собственной системе, то вы можете просто указать внутреннюю ссылку на тот же файл, возможно, сохранив бит для "копирования при записи" или что-то в этом роде, чтобы сделать это эффективным.

0
ответ дан 14 December 2019 в 01:03
поделиться

На мой взгляд, видео - это ресурс. Итак, у этого ресурса есть путь. что, если вы выполните ОБНОВЛЕНИЕ, которое изменит путь к ресурсу?

Затем в вашем коде, если он изменит путь, вам просто нужно переместить файл.

0
ответ дан 14 December 2019 в 01:03
поделиться

REST не ограничивается HTTP! Лучше всего использовать webdav для решения вашей проблемы.

0
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: