Мне нужно вызвать процесс, который не требует ввода от пользователя, только триггер. Я планирую использовать POST / URI без тела для запуска процесса. Я хочу знать, считается ли это плохим с точки зрения HTTP и REST?
Мне нужно вызвать процесс, который не требует ввода от пользователя, только триггер. Я планирую использовать POST / URI без тела для запуска процесса. Я хочу знать, считается ли это плохим с точки зрения HTTP и REST?
Ответы:
Я задал этот вопрос в рабочей группе IETF HTTP несколько месяцев назад. Короткий ответ: НЕТ, это не плохая практика (но я предлагаю прочитать ветку для более подробной информации).
Использование POST вместо GET вполне разумно, поскольку оно также указывает серверу (и шлюзам на этом пути) не возвращать кэшированный ответ.
POST полностью в порядке. В отличие от GET с POST вы меняете состояние системы (скорее всего, ваш триггер «что-то делает» и изменяет данные).
Я использовал POST уже без полезной нагрузки, и он чувствует себя хорошо. Одна вещь, которую вы должны сделать при использовании POST без полезной нагрузки: Pass header Content-Length: 0
. Я помню проблемы с некоторыми прокси, когда я api-клиент не прошел его.
Если вы используете POST / uri без тела, это похоже на использование функции, которая не принимает аргумент .eg int post (void); поэтому разумно иметь функцию для вашего класса ресурсов, которая может изменять состояние объекта без аргумента. Если вы подумаете о реализации сенсорной функции Unix для URI, разве это не будет хорошим выбором?
Да, можно отправлять запрос POST без тела и вместо этого использовать параметры строки запроса. Но будьте осторожны, если ваши параметры содержат символы, которые не являются действительными HTTP, вам придется их кодировать.
Например, если вам нужно POST 'hello world' до конечной точки, вы должны сделать так, чтобы это выглядело так: http://api.com?param=hello%20world
Поддержка ответов о том, что POST в этом случае в порядке, заключается в том, что в случае с Python среда OpenAPI «FastAPI» генерирует графический интерфейс Swagger (см. Изображение), который не содержит раздел Body, когда метод (см. Пример ниже) не поддерживает есть параметр, чтобы принять тело.
метод "post_disable_db" просто принимает параметр пути "db_name" и не имеет второго параметра, который подразумевал бы обязательное тело.
@router.post('/{db_name}/disable',
status_code=HTTP_200_OK,
response_model=ResponseSuccess,
summary='',
description=''
)
async def post_disable_db(db_name: str):
try:
response: ResponseSuccess = Handlers.databases_handler.post_change_db_enabled_state(db_name, False)
except HTTPException as e:
raise (e)
except Exception as e:
logger.exception(f'Changing state of DB to enabled=False failed due to: {e.__repr__()}')
raise HTTPException(HTTP_500_INTERNAL_SERVER_ERROR, detail=e.__repr__())
return response