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 - потому что мы все этого хотим