используя HTTP PUT, но не полностью заменить сущность - PullRequest
6 голосов
/ 23 июня 2009

Я разрабатываю REST API, и мне интересно следующее:

Я хочу использовать HTTP PUT для обновления некоторых объектов в веб-сервисе. Форматом будет тело в кодировке urlencoded. Допустимо ли обновлять только те поля, которые фактически были указаны, а не весь объект?

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

Ответы [ 4 ]

4 голосов
/ 23 июня 2009

Вы можете просто отправить обновленные свойства ресурса. Помните, что POST - это универсальный глагол, который вы можете использовать, чтобы делать все, что вам нужно, когда другие глаголы не работают для вас.

Проверьте статью Роя Можно использовать POST

2 голосов
/ 23 июня 2009

Поставка только для полной замены.Существует предложение для глагола PATCH для решения вашей проблемы (http://www.ietf.org/internet-drafts/draft-dusseault-http-patch-14.txt)

Patch, однако, все равно может не соответствовать вашему желанию. Отправляется ресурс обновления, который может выполнять такие действия, как счетчики приращенийи поэтому, в отличие от пут, не является идемпотентом.

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

1 голос
/ 24 июня 2009

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

  1. PUT на новый ресурс «обновление». В основном он будет записывать обновление, которое вы хотите применить, а затем отвечать за не применение дубликатов. Я предполагаю, что эта работа будет чем-то похожа на систему контроля версий, которая хранит список патчей / наборов изменений и становится довольно сложной каждый раз, когда я пытаюсь продумать все возможные варианты.

  2. PUT для ресурса, но не изменяйте никакие поля, которых нет. Заполните поля, которые вы хотите, чтобы NULL, присутствовал со специальным атрибутом, указывающим, что вы хотите NULL его. Это кажется гораздо более практичным, но не очень хорошо согласуется с тем, что PUT должно быть полным обновлением.

Если у кого-то есть указания на обсуждение похожих идей, пожалуйста, отредактируйте / прокомментируйте соответственно.

1 голос
/ 23 июня 2009

Я бы сказал, что это может иметь смысл. Я считаю идею REST очень гибкой, поэтому если вы обновляете одну сущность, почему бы не перенести только те поля, которые необходимо обновить в вашей реализации. Правда, для этого нужно больше усилий со стороны сервера. Вы должны проверить, доступна ли сущность и может ли она быть обновлена ​​с помощью переданных данных, и вам нужны проверочные проверки (в отличие от данных, ориентированных на схемы без документов).

<!-- PUT books/1337 -->

<book>
    <title>Hello</title>
    <author>John Doe</author>
</book>

<!-- PUT books/1337 -->

<book>
    <title>Hello here I am</title>
</book>
...