Я хотел бы использовать параметры запроса в POST и других методах модификации. Это может относиться к обычным параметрам запроса или к тем, которые извлекаются с помощью правил URL с переменными. Но я заметил, что Ева специально отбрасывает эти параметры для вызовов POST. Я могу легко внести изменения, необходимые для их сохранения, но, поскольку они преднамеренно удаляются, мне интересно, есть ли какие-то недостатки в их наличии. Чем обусловлено такое дизайнерское решение?
Пример использования
Возможно, возникает вопрос, зачем кому-то вообще использовать такие параметры запроса. API, который я имею в виду, использует параметры запроса в вызовах POST и DELETE. Одним из примеров того, почему это может быть удобно, является предоставление пользователю возможности изменять проверку и фактическое поведение вызова. Чтобы привести несколько надуманный пример:
DELETE /resource/123
-- fails if there are dependent objects for this resource
DELETE /resource/123?cascade=true
-- allow delete to cascade to dependent objects (eg. user clicked "I am sure")
Другой пример:
POST /user?allowId=True { "id" : 123, "name" : "Bob }
-- will accept externally-defined ID as opposed to generating a new one
Другой пример:
POST /container/<foo>/resource { ... }
-- create a new resource inside of the <foo> container
Отредактировано
Я попытался использовать request.args, чтобы получить правила для переменных, но, похоже, это не сработало. (Таким образом можно получить аргументы запроса, но я бы хотел, чтобы правила для переменных также работали.)
*in settings.py*
DOMAIN = {
'ducks' : {
'url':'rows/<row>/ducks',
'schema': {
'name' : { 'type' : 'string' }
}
}
}
*command line*
curl -H "Content-Type: application/json" -X POST 'http://localhost:5001/rows/1/ducks' -d '{"name":"bob"}
Когда код входит в мой хук on_pre_POST, request.args пуст. Если я пройдусь по стеку, я увижу, что в endpoints.collection_endpoint()
функция lookup
действительно содержит {'row':1}
, но не передается в вызов post(response)
. Я могу отправить запрос на включение, чтобы исправить это, если это имеет смысл.
Отредактировано 2
Я обнаружил, что эти параметры доступны в request.view_args
, а не в request.args
. Это означает, что оба типа параметров доступны в любом месте flask/eve без изменения кода.