2009-08-22 2 views
2

Структура agavi использует запрос PUT для создания и POST для обновления информации. Обычно в REST это используется наоборот (часто ссылаясь на POST, добавляя информацию, в то время как PUT заменяет всю запись данных).Использует ли php mvc framework agavi CRUD, совместимый с REST?

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

Спасибо.

ответ

5

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

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

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

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

+0

Спасибо за ваш ответ. Да, я видел несколько инструкций о том, как изменить его в файле factories.xml. Мне было интересно узнать, почему рельсы и агави отличаются своим подходом. Я думаю, ваш ответ дал мне новую перспективу для этого вопроса. – txwikinger

+0

Чтобы уточнить, вы должны указать «HTML 4.01», так как рабочий черновик HTML5 добавляет другие HTTP-глаголы в веб-формы. – aehlke

0

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

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

+1

Спасибо за ваш ответ. Мой вопрос задал вопрос, правильно ли использует agavi REST, следовательно, тег. – txwikinger

+0

Так или иначе, я удалил теги REST - я думаю, что вы ошибочно интерпретируете REST. То, что вы на самом деле имеете в виду, это «если agavi использует HTTP надлежащим образом». – aehlke

2

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

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

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

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

+0

Спасибо за ваш ответ. Вопрос, является ли идемпотент Агави именно то, что я пытаюсь выяснить. – txwikinger

0

У меня была эта проблема раньше. Это можно решить с помощью changing the factories.xml

+0

Спасибо за ваш ответ. Я знаю о конфигурации factories.xml. Меня интересует принцип, как это должно быть сделано правильно, поскольку разные структуры, похоже, делают это по-другому. – txwikinger