GET или PUT для запроса REST - PullRequest
       13

GET или PUT для запроса REST

3 голосов
/ 04 февраля 2010

У меня есть ситуация, когда клиентское приложение может запросить ресурс, соответствующий определенным критериям, и, если соответствующий ресурс не существует, он создается и кэшируется. Последующие запросы по тем же критериям вернут кэшированный ресурс.

Я мог бы реализовать это с помощью запроса PUT для создания ресурса и последующих GET. Однако в моем конкретном сценарии требуется, чтобы клиент слишком много знал о внутренней работе моей системы, т. Е. Клиенту не нужно заботиться о том, существует ли ресурс или нет.

Так стоит ли разрешать клиенту делать один GET-запрос, который создаст ресурс, если он еще не существует?

Ответы [ 4 ]

6 голосов
/ 04 февраля 2010

Теоретически GET должен просто GET , а не изменять состояние вашей системы. См. Идемпотентность .

Абзац из Википедии:

Некоторые методы (например, HEAD, GET, OPTIONS и TRACE) определены как безопасные, что означает, что они предназначены только для поиска информации и не должны изменять состояние сервера.

Однако в вашем сценарии начальный GET настраивает ресурс исключительно для кэширования. Последующие вызовы не изменят состояние системы, поэтому я полагаю, что с GET все в порядке в этом сценарии.

3 голосов
/ 04 февраля 2010

Абсолютно уместно использовать GET для этой цели; «Рендеринг» ресурса находится за пределами сферы взаимодействия клиента и сервера, поэтому на самом деле не имеет значения, создан он или нет - это проблема реализации за пределами единого интерфейса.

То, что я говорю, это то, что это не имеет значения для клиента - потому что для него запрос является безопасным + идемпотентным. Не имеет значения, создает ли сервер какой-либо контент, чтобы возвращать его «на лету» по соображениям эффективности, или он «уже существовал» и просто выводился.

GET / resource? Attribute1 = xyz & crit2 = abc

1 голос
/ 04 февраля 2010

Да, если единственной целью создания ресурса является его кеширование. Таким образом, вы можете думать, что ваша система уже содержит все возможные результаты GET, и идемпотентность не нарушается. Как машина получает результат (из кэша или по вашему алгоритму) не имеет значения и даже неинтересна.

Ричард Эв. Если бы вы были настолько строги, вы бы даже не могли записать GET-запрос на ваш сервер, так как регистрация является побочным эффектом и изменяет состояние системы. РЕДАКТИРОВАТЬ: я вижу, что вы не так уж строг, и я согласен: -)

0 голосов
/ 04 февраля 2010

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

Если вы используете GET, чтобы изменить какое-то состояние, и если ваше приложение находится в Интернете, сканирование поисковой системы может иметь нежелательный характер.Влияние на вашу систему.

Кроме того, запросы GET кэшируются браузером, поэтому вы можете сэкономить некоторую пропускную способность и ресурсы сервера в случае данных, которые изменяются реже.

...