Подтвердить что ты не робот

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

Я создаю RESTful api, используя Zend Framework через Zend_Rest_Route. Для загрузки файлов я должен использовать PUT или POST для обработки процесса? Я стараюсь быть максимально последовательным с определением глаголов REST. Пожалуйста, обратитесь к: PUT или POST: REST of the Story

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

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

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

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

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

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

4b9b3361

Ответ 1

Здесь, похоже, довольно много недоразумений. PUT и POST не совсем о замене или создании, а скорее о идемпотентности и именах ресурсов.

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

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

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

Резюме: Не думайте о создании/обновлении, а скорее о том, кто делает имена ресурсов и какие операции являются идемпотентными. PUT действительно создает или обновляет, и POST действительно делает-ничего, что-shouldnt-be-repeat-willy-nilly.

Ответ 2

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

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

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

Ответ 3

REST не является стандартом, поэтому это может легко превратиться в религиозную битву. Стандарты AtomPub и OData, которые считаются "RESTful", соглашаются на это, хотя: POST = создание в то время как PUT = updates

Ответ 4

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

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

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

Чтобы процитировать связанную статью:

PUT помещает страницу по определенному URL-адресу. Если там уже есть страница, ее заменено в toto. Если нет страницы там создается новый. Эта означает его как DELETE, за которым следует вставка новой записи с тот же первичный ключ