2013-05-19 2 views
2

Я создаю REST API для службы резервного копирования, которая в принципе достаточно проста:Как смоделировать REST API с помощью "POST to PUT redirect"?

  • пользователь идентифицируется некоторым uid;
  • файлы идентифицированы некоторыми fid;
  • загрузить файл, ЗН файл пользователя POST в /backups/<uid> и место возвращается
  • список файлов, пользователь GET ей /backups/<uid> и некоторый индекс fid с возвращаемый
  • для загрузки файла, пользователь выбирает один из индекса, GET s /backup/<uid>/<fid> и файл возвращается.

Теперь я хочу значительно сократить трафик на свой сервер, делегируя загрузку и загрузку на сервисы, такие как Amazon S3.

Переназначение загрузки не является проблемой, так как я могу просто выполнить регулярное перенаправление (301 или 307?) На какой-то сгенерированный URL-адрес с истекающим сроком действия.

А как насчет загрузок? Я надеюсь, что-то вроде этого:

  • пользователя (не зная о S3) начинает POST файл к моему серверу
  • сервер получает заголовки только
  • сервер (а не весь файл!) определяет место в S3, истекающую генерирует URL для PUT и перенаправляет к нему
  • клиенту PUT ь файл в URL он был передан на сервер
  • сервер получает уведомление о успешном завершении загрузки

Дело в том, что все это должно быть максимально прозрачным для пользователей.

ответ

2

Я не думаю, что первоначальный POST должен включать в себя всю сущность. Скорее, POST должен явно быть запросом для создаваемого ресурса «загружать ведро». Затем вы просто ответите на запрос POST 201 Created, с заголовком Location, указывающим на новый ресурс, в который должен быть загружен файл.

Если выбранный загрузочный ковш должен зависеть от специфики файла (размера файла, типа), я бы разрешил клиенту отправлять метаданные в тело POST.

+0

Не правда ли, что в этом случае «Местоположение» для 'PUT' больше не будет действительным? Обычно, если вы 'PUT' что-то, вы ожидаете, что сможете« ПОЛУЧИТЬ »его после. –

+0

Я думаю, что нет такого ожидания. В любой момент времени (также сразу после PUT) другой клиент может удалить DELETE на конкретном ресурсе. Последовательность «PUT, GET», которую вы описываете, не происходит в транзакции или так. –

+0

Чтобы быть более точным, я думаю, можно сказать, что после «PUT» есть «ожидание», GET вернет объект, который был PUT там, но для этого не существует * требования *. Если ожидания клиента не выполняются, это указывает на то, что другой клиент сталкивается с этим ресурсом. –