И POST, и PUT могут использоваться для операций создания и обновления в различных ситуациях. Так в чем же разница между PUT и POST?
В двух словах: используйте PUT тогда и только тогда, когда вы знаете как URL, по которому будет располагаться ресурс, так и все содержимое ресурса. В противном случае используйте POST.
POST - невероятно общий глагол. Так как он не обещает ни безопасности, ни идемпотентности, и в RFC он имеет относительно свободно сформулированное описание, вы можете использовать его практически для чего угодно. Фактически, вы можете сделать все ваши запросы POST-запросами, потому что POST дает очень мало обещаний; он может вести себя как GET, PUT или DELETE, если захочет. Он также может делать некоторые вещи, которые не может сделать ни один другой глагол - он может создавать новый ресурс по URL, отличному от URL в HTTP-запросе; и он может модифицировать часть ресурса, не меняя целиком (хотя предложенный, но не общепринятый метод PATCH может сделать нечто подобное).
PUT - гораздо более ограничительный глагол. Он берет полный ресурс и сохраняет его по указанному URL. Если ранее там был ресурс, он заменяется; если нет, то создается новый. Эти свойства поддерживают идемпотентность, чего не может быть наивная операция создания или обновления. Я подозреваю, что это может быть причиной того, почему PUT определяется так, как он есть это идемпотентная операция, которая позволяет клиенту отправлять информацию на сервер.
Ссылки:
- RFC 2616 - HTTP 1.1
- RFC 5789 - метод PATCH для HTTP
- Мартин Фаулер, модель зрелости Ричардсона