HTTP MODIFY глагол для REST?

Насколько я вижу, нет RESTful способа применить модификацию к ресурсу. Чтобы сделать это, вы должны положить ресурс в целом, перезаписав предыдущее представление. Я думаю, что это является источником проблем, в частности, когда ресурс имеет большое представительство.

Я считаю, что это намекает на отсутствие глагола в HTTP1.1: что-то вроде MODIFY или PATCH. Даже у WebDAV нет этого глагола (у него есть PROPPATCH, концепция которого похожа, но не для ресурсов).

Разве текущий набор глаголов HTTP 1.1 не слишком ограничен для RESTing реального мира?

Изменить: я нашел предложение в IETF о глаголе PATCH

http://tools.ietf.org/html/draft-dusseault-http-patch-15

Эта спецификация определяет новый метод PATCH HTTP/1.1 [RFC2616], который используется для применения частичных модификаций к ресурсу.

Новый метод необходим для улучшения взаимодействия и предотвращения ошибок. Метод PUT уже определен для перезаписи ресурса новым телом и не может использоваться повторно для частичных изменений. В противном случае прокси и кеши и даже клиенты и серверы могут быть сбиты с толку из-за результата операции. PATCH упоминался в более ранних спецификациях HTTP, но не был полностью определен.

Насколько я вижу, единственная проблема такого глагола - отсутствие идемпотентности.

Изменить: По состоянию на март 2010 года существует RFC 5789 ( метод PATCH для HTTP).

4 ответа

Решение

Есть веская причина, почему нет такого глагола, чтобы сделать это. Это почти невозможно управлять. Подумайте о сотнях клиентов, которые изменяют один и тот же ресурс таким образом, как вы узнаете, где заканчивается ваша модификация? Что если порядок имеет значение, и ваш "патч" фактически добавляется после другого "патча", а теперь то, что вы хотели добавить, на самом деле не то, что было добавлено. Использование PUT с заголовками ETag - гораздо более разумный подход к изменению ресурса, чем попытка объединить новый глагол с неизвестными результатами. Фактически получить ресурс - это небольшая цена за повторяющиеся результаты.

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

Например, у вас есть ресурс / user, представляющий информацию об учетной записи пользователя, вы можете создать подресурс / user / email, а затем сделать PUT для обновления только электронной почты.

Вы можете использовать POST для частичных обновлений. Это не идеально, но это довольно RESTful.

Я хотел бы, чтобы были стандартизированные и поддерживаемые глаголы, как...

  • НАЙТИ, ПОИСК или ЗАПРОС - поэтому ясно, что запрос относится не к ресурсу, а к расположению других ресурсов. Может быть, только ограниченная полезность.
  • MOVE, COPY, LINK - чертовски удобно, они будут действовать подобно инструментам командной строки.
  • DISCOVER, MAP, INDEX или SITEMAP - так вы можете получить расположение ресурсов, концептуально похожее на файл wsdl, или файл system.listMethods из xmlrpc.
  • BEGIN, ACQUIRE или LOCK и COMMIT, END, DONE или RELEASE - чтобы было понятно, когда вы начинаете и заканчиваете транзакции или используете промежуточные ресурсы.
  • MODIFY, UPDATE, PATCH - потому что мы все этого хотим
Другие вопросы по тегам