Подтвердить что ты не робот

Дизайн REST для загрузки файлов

Мне нужно создать REST API для службы загрузки файлов, которая позволяет пользователю:

  • Открыть сеанс
  • Загрузите кучу файлов
  • Закройте сеанс

И потом, вернитесь и сделайте все с файлами, которые они загрузили в предыдущем сеансе.

Чтобы облегчить работу с данными о каждом файле и иметь дело с содержимым самого файла, это схема URI, о которой я думаю:

/sessions/
/sessions/3
/sessions/3/files
/sessions/3/files/5
/sessions/3/file/5/content
/sessions/3/file/5/metadata

Это позволит метаданные файла обрабатываться отдельно от содержимого файла. В этом случае разрешено только GET для содержимого файла и метаданных файла, а для обновления одного из них новый файл должен быть PUT.

Это имеет смысл? Если нет, то почему и как это может быть лучше?
4b9b3361

Ответ 1

Зачем вам нужны сеансы? Это для целей аутентификации и авторизации? Если это так, я бы использовал http basic с SSL или digest. Как таковой нет начального или конечного сеанса, поскольку HTTP не имеет статуса и заголовки безопасности отправляются по каждому запросу.

Предложение ресурса для загрузки было бы непосредственно отображать как частную файловую систему


# returns all files and subdirs of root dir
GET /{userId}/files
GET /{userId}/files/file1
GET /{userId}/files/dir1
# create or update file
PUT /{userId}/files/file2



При загрузке содержимого файла вы будете использовать тип многостраничного контента.

Пересмотренный ответ после комментария

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

Ресурс 'upload' представления:


{
  "upload-content" : "http://storage.org/2a34cafa" ,
  "metadata" : "{ .... }" 
}

Действия с ресурсами:


# upload file resource
POST /files
-> HTTP 201 CREATED 
-> target location is shown by HTTP header 'Location: /files/2a34cafa

# /uploads as naming feels a bit more natural as /files
POST /sessions/{sessionId}/uploads
-> HTTP 201 CREATED
-> HTTP header: 'Location: /sessions/{sessionId}/uploads/1
-> also returning payload

# Updating upload (like metadata)
/PUT/sessions/{sessionId}/uploads/1