Дизайн RESTful - как моделировать вложения объекта

Я пытаюсь смоделировать вложения объекта в REST. Допустим, к объекту дефекта может быть прикреплено несколько вложений. Каждое вложение имеет описание и некоторые другие свойства (последнее изменение, размер файла...). Сам вложение представляет собой файл любого формата (jpeg, doc...)

Мне было интересно, как мне смоделировать его RESTful

Я думал о следующих двух вариантах:

Первый подход (с использованием одного и того же ресурса, разных представлений):

  • GET , тип содержимого:XML на http://my-app/defects/{id} /attachments вернет метаданные вложений дефекта в формате XML (описание, последнее изменение, размер файла...)

  • GET , тип содержимого:gzip на http://my-app/defects/{id} /attachments вернет вложения дефекта в zip-файле.

  • GET , content-type:mime multi-part on http://my-app/defects/ {id}/attachments вернет вложения дефекта в сообщении, состоящем из нескольких частей (все двоичные данные и метаданные XML).

  • POST, тип содержимого: XML на http://my-app/defects/{id} /attachments создаст новое вложение, только метаданные без прикрепленного файла (тогда пользователь должен отправить запрос PUT с двоичными данными)

  • POST , тип содержимого: mime\multi-part на http://my-app/defects/{id}/attachments создаст вложение, клиент может отправить как метаданные, так и сам файл за один раз

Второй подход (отделить данные вложения от метаданных):

  • GET , тип содержимого:XML на http://my-app/defects/{id} /attachments вернет метаданные вложений дефекта в формате XML (описание, последнее изменение, размер файла...)

  • GET , тип содержимого:gzip на http://my-app/defects/{id} /attachments/files вернет двоичные данные вложений дефекта в одном zip-архиве.

Создание нового вложения, первый вызов:

  • POST, тип содержимого: XML на http://my-app/defects/{id} /attachments создаст новое вложение, только метаданные без прикрепленного файла (тогда пользователь должен отправить запрос PUT с двоичными данными)

Затем добавьте сами двоичные данные:

  • POST , тип содержимого: mime\multi-part на http://my-app/defects/{id}/attachments/{id}/file создаст файл вложения

С одной стороны, первый подход более надежен и эффективен, поскольку клиент может создавать\получать метаданные вложений и двоичные данные за один цикл. С другой стороны, я немного неохотно использую представление mime-multipart, поскольку оно более громоздко для потребления и производства.

EDIT: я проверил REST API загрузки мерцания. Кажется, они используют сообщения, состоящие из нескольких частей, чтобы включать как фотографию, так и атрибуты фотографии.


person LiorH    schedule 08.10.2009    source источник


Ответы (2)


Не управляйте метаданными отдельно. Действие, состоящее из двух частей, противоречит точке ОТДЫХА.

Обычно выполняется один плавный GET/POST/PUT/DELETE с одной — относительно — сложной полезной нагрузкой.

Тот факт, что это несколько базовых «объектов» в «таблицах», не имеет отношения к REST.

На уровне REST это всего лишь одно состояние сложного объекта, передаваемое одним сообщением.

person S.Lott    schedule 08.10.2009
comment
спасибо за ваш ответ, вы бы предложили попробовать создать эту сложную структуру в XML или MIME, состоящую из нескольких частей? передача двоичного файла в XML не очень эффективна, но формат mime multipart не интуитивно понятен. - person LiorH; 08.10.2009
comment
JSON и YAML для этого более эффективны, чем XML. - person S.Lott; 08.10.2009

Большая часть этой проблемы уже решена спецификацией Atom Pub. См. здесь

В предлагаемых вами решениях нужно быть осторожным с тем, что вы используете согласование контента для доставки другого контента. Я считаю, что это считается плохим. Согласование контента должно предоставлять только разные представления одного и того же контента.

person Darrel Miller    schedule 08.10.2009
comment
интересная ссылка, спасибо. этот подход требует двух круговых обходов для создания нового вложения. Мне нужно решить, насколько важно однократное путешествие туда и обратно. - person LiorH; 08.10.2009
comment
Я не уверен, что это так. В примере говорится о размещении изображения в качестве второго шага для простого обновления изображения. Исходный POST содержал изображение в теле. - person Darrel Miller; 08.10.2009
comment
ты прав, извини. первый шаг отправляет изображение как двоичные данные, поэтому это сообщение не может включать дополнительные свойства изображения (например, описание). - person LiorH; 08.10.2009