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

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

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

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

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

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

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

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

4 ответов


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

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

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

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

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


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

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

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


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


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

Я должен знать точный URL, чтобы поставить к

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

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

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