PUT vs. POST для загрузки файлов RESTful api будет построен с использованием Zend Framework - PullRequest
47 голосов
/ 08 июня 2011

Я создаю RESTful API, используя Zend Framework через Zend_Rest_Route.Для загрузки файлов, я должен использовать PUT или POST для управления процессом?Я стараюсь максимально соответствовать определению глаголов REST.Пожалуйста, обратитесь к: PUT или POST: ОТДЫХ Истории

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

Давайте предположим, что это REST API для изображенийзагрузить.Означает ли это, что я должен использовать POST, если сервер должен манипулировать файлами изображений (т.е. создавать миниатюры, изменять размер и т. Д.);и использовать PUT, если я просто сохраняю файл необработанного изображения на сервер?

Если я использую PUT для обработки загрузки файла, должен ли процесс быть следующим:

  1. Пользователь отправляетGET-запрос на получение определенного URL-адреса для файла, который должен быть PUT.
  2. Затем пользователь отправляет PUT-запрос на URL-адрес из ответа GET.Загружаемый файл является сырым точно так же, как загруженный пользователем.

Я совершенно новичок в этом;так что, надеюсь, у меня есть смысл ...

Если вы знаете «лучший» способ сделать это, не стесняйтесь комментировать.

Ответы [ 4 ]

119 голосов
/ 18 января 2013

Кажется, здесь есть немного недоразумений.PUT против POST - это не на самом деле о замене и создании, а о идемпотентности и именовании ресурсов.

PUT - идемпотентная операция.С его помощью вы даете имя ресурса и объект для размещения в качестве содержимого этого ресурса (возможно, с добавлением, генерируемым сервером).Важно отметить, что выполнение операции дважды подряд должно привести к тому же результату, как если бы он был выполнен один раз или 20 раз, для некоторого довольно свободного определения «одно и то же» (оно не обязательно должно быть байт забайт идентичен, но информация, которую предоставил пользователь, должна быть нетронутой).Вы никогда не захотите, чтобы PUT вызвал запуск финансовой транзакции.

POST - неидемпотентная операция.Вам не нужно указывать имя ресурса, который вы хотите создать (и POST не может создать ; при желании он может дублировать ресурсы).POST часто используется для реализации «создания ресурса с новым именем и скажите мне, как оно называется» - отсутствие идемпотентности, подразумеваемое «новым именем», соответствует этому.Там, где создается новый ресурс, отправка обратно локатора для ресурса в заголовке Location - совершенно правильная вещь.

Теперь, если вы занимаетесь политическим положением, клиенты не должны никогда создавать имена ресурсов, затем вы получаете POST, который идеально подходит для создания (хотя теоретически он может делать все что угодно на основе предоставленной сущности), а PUT - как выполнять обновление.Для многих RESTful-приложений это имеет смысл, но не для всех;если модель, представляемая пользователю, представляла собой файловую систему, то предоставление пользователем имени ресурса имеет огромное значение, и PUT становится основной операцией создания (а POST делегируется менее распространенным вещам, таким как создание пустого каталога и т. д.).on; WebDAV еще больше снижает потребность в POST).

Краткое содержание: Не думайте с точки зрения создания / обновления, а скорее с точки зрения того, кто делает имена ресурсов и какиеоперации идемпотентны.PUT на самом деле создает или обновляет, а POST действительно делает все, что не следует повторять, волей-неволей.

9 голосов
/ 19 декабря 2012

Для загрузки файла, если он не заменяет существующий ресурс, обязательно используйте POST.

В REST POST - это создание новых ресурсов, PUT для замены существующих ресурсов, GET для извлечения ресурсов и DELETE для удаления ресурсов.

Источник: http://en.wikipedia.org/wiki/Representational_state_transfer#RESTful_web_services

3 голосов
/ 08 июня 2011

ОТДЫХ не является стандартом, поэтому это может легко превратиться в религиозную битву.Стандарты AtomPub и OData, которые считаются «RESTful», согласны с этим: POST = создание, а PUT = обновления

0 голосов
/ 08 июня 2011

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

Мне нужно знать точный URL для PUT до

Нет. Вам не нужно знать URL для PUT, т. Е. PUT URI не обязательно должен присутствовать перед операцией PUT. Если ресурс не существует, ресурс создается. Если ресурс уже существует, его заменяют новым представлением.

Цитировать связанную статью:

PUT помещает страницу по определенному URL. Если там уже есть страница, это заменил в целом. Если нет страницы там создается новый. это означает, что это как УДАЛЕНИЕ с последующим вставка новой записи с тот же первичный ключ

...