Считается ли плохой практикой выполнение HTTP POST без тела объекта?

177

Мне нужно вызвать процесс, который не требует ввода от пользователя, только триггер. Я планирую использовать POST / URI без тела для запуска процесса. Я хочу знать, считается ли это плохим с точки зрения HTTP и REST?

Суреш Кумар
источник
6
Спасибо всем за ваши предложения. Хотя все предлагали аналогичное предложение, т. Е. Это нормально для POST с нулевым содержанием, я выбираю правильный ответ Даррела из-за ссылки на обсуждение IETF. Дискуссия многое проясняет.
Суреш Кумар

Ответы:

155

Я задал этот вопрос в рабочей группе IETF HTTP несколько месяцев назад. Короткий ответ: НЕТ, это не плохая практика (но я предлагаю прочитать ветку для более подробной информации).

Даррел Миллер
источник
4
Любой обновленный источник, который подтвердит это через 10 лет?
Баптист Пернет
79

Использование POST вместо GET вполне разумно, поскольку оно также указывает серверу (и шлюзам на этом пути) не возвращать кэшированный ответ.

Адам Ванденберг
источник
50

POST полностью в порядке. В отличие от GET с POST вы меняете состояние системы (скорее всего, ваш триггер «что-то делает» и изменяет данные).

Я использовал POST уже без полезной нагрузки, и он чувствует себя хорошо. Одна вещь, которую вы должны сделать при использовании POST без полезной нагрузки: Pass header Content-Length: 0. Я помню проблемы с некоторыми прокси, когда я api-клиент не прошел его.

Мануэль Алдана
источник
16

Если вы используете POST / uri без тела, это похоже на использование функции, которая не принимает аргумент .eg int post (void); поэтому разумно иметь функцию для вашего класса ресурсов, которая может изменять состояние объекта без аргумента. Если вы подумаете о реализации сенсорной функции Unix для URI, разве это не будет хорошим выбором?

yadab
источник
6
Touch / finger - это учебник, иллюстрирующий неидемпотентное действие, которое по своей сути лишено содержания.
Крис Марисич
2

Да, можно отправлять запрос POST без тела и вместо этого использовать параметры строки запроса. Но будьте осторожны, если ваши параметры содержат символы, которые не являются действительными HTTP, вам придется их кодировать.

Например, если вам нужно POST 'hello world' до конечной точки, вы должны сделать так, чтобы это выглядело так: http://api.com?param=hello%20world

marko982
источник
0

Поддержка ответов о том, что 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

введите описание изображения здесь

RaamEE
источник