Использует ли php mvc framework agavi CRUD, совместимый с REST? - PullRequest
3 голосов
/ 22 августа 2009

Платформа agavi использует запрос PUT для создания и POST для обновления информации. Обычно в REST это используется наоборот (часто ссылаясь на добавление POST-информации, в то время как PUT заменяет всю запись данных).

Если я правильно понимаю, важная проблема заключается в том, что PUT должен быть идемпотентным, в то время как POST не имеет этого требования. Поэтому я удивляюсь, как создание новой записи может быть идемпотентным (т. Е. Многократный запрос не приводит к множественному созданию записи), в частности, когда обычно ORM использует идентификатор в качестве первичного ключа, а идентификатор новой записи не известен. клиенту (поскольку он автоматически создается в базе данных), следовательно, не может быть частью запроса. Как agavi поддерживает требование идемпотентности в свете этого для запроса PUT.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 25 августа 2009

PUT может использоваться как для создания, так и для обновления полных записей. POST обычно используется для частичных обновлений и связанных операций, а также для создания нового типа записи на сервере без указания URL-адреса для ресурса (например, POST для / articles / 23 / comments возвращает статус 201 и местоположение: / article / 23 / comments / 283136). Так что в вашем случае (с идентификатором последовательности / автоинкремента) вы бы использовали этот подход.

Однако HTML (и, следовательно, веб-формы) отличается. Он знает только GET и POST, а не DELETE и PUT. Для операций удаления и обновления он перегружает метод POST.

Именно поэтому Agavi по умолчанию отображает POST для «записи» и GET для «чтения» - это наиболее распространенный вариант использования, а «чтение» и «запись» были выбраны, потому что они относительно нейтральны, а также в некотором смысле представляют аспекты безопасности GET против POST (безопасность, как в «GET можно вызывать без побочных эффектов» и т. д.)

Вы можете изменить отображение глаголов для реализации AgaviWebRequest в factories.xml; обратитесь к списку рассылки пользователей Agavi или IRC-каналу, если вам нужна помощь в этом (или спросите здесь). Многие люди на IRC-канале также достаточно опытны в разработке схемы URL-адресов на случай, если вам потребуется дополнительная помощь в создании привлекательного API.

2 голосов
/ 25 августа 2009

Вместо того, чтобы думать о PUT как о творении, думайте об этом как о «положении». Вы помещаете ресурс в URI (т.е. отправляете весь ресурс в URI).

PUT http://example.com/articles/1

Если вы повторите это (отправите один и тот же ресурс целиком на тот же URI), вы получите тот же результат, и вы не изменили ресурс по этому URI, вот что делает его идемпотентным.

Если реализация agavi PUT идемпотентна, то она правильно реализует PUT. В противном случае это не так.

0 голосов
/ 27 августа 2009

У меня была эта проблема раньше. Это можно решить путем изменения factories.xml

0 голосов
/ 24 августа 2009

PUT может использоваться для создания ресурса, за исключением того, что если ресурс уже существует (или уже был создан предыдущим PUT), он просто обновит его. Однако POST не должен обновлять ресурсы, если это простой CRUD. Обратите внимание, что у глаголов HTTP нет определенного отображения определенных действий, поскольку они полезны не только для CRUD.

Также обратите внимание, что этот вопрос не имеет ничего общего с REST - только правильное использование HTTP. Поэтому, пожалуйста, удалите тег REST.

...