Я создаю 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 он был передан на сервер - сервер получает уведомление о успешном завершении загрузки
Дело в том, что все это должно быть максимально прозрачным для пользователей.
Не правда ли, что в этом случае «Местоположение» для 'PUT' больше не будет действительным? Обычно, если вы 'PUT' что-то, вы ожидаете, что сможете« ПОЛУЧИТЬ »его после. –
Я думаю, что нет такого ожидания. В любой момент времени (также сразу после PUT) другой клиент может удалить DELETE на конкретном ресурсе. Последовательность «PUT, GET», которую вы описываете, не происходит в транзакции или так. –
Чтобы быть более точным, я думаю, можно сказать, что после «PUT» есть «ожидание», GET вернет объект, который был PUT там, но для этого не существует * требования *. Если ожидания клиента не выполняются, это указывает на то, что другой клиент сталкивается с этим ресурсом. –