É uma prática recomendada executar HTTP POST sem o corpo da entidade?

176

Preciso invocar um processo que não exija nenhuma entrada do usuário, apenas um gatilho. Eu pretendo usar o POST / uri sem um corpo para acionar o processo. Quero saber se isso é considerado ruim das perspectivas HTTP e REST?

Suresh Kumar
fonte
6
Obrigado a todos por suas sugestões. Embora todo mundo tenha dado sugestões semelhantes, ou seja, não há problema em POST com conteúdo zero, estou selecionando a resposta de Darrel como correta devido ao link para a discussão da IETF. A discussão esclarece muito.
Suresh Kumar

Respostas:

154

Eu fiz essa pergunta no grupo de trabalho HTTP da IETF há alguns meses atrás. A resposta curta é: NÃO, não é uma prática ruim (mas sugiro ler o tópico para obter mais detalhes).

Darrel Miller
fonte
3
Alguma fonte atualizada que confirmaria isso 10 anos depois?
Baptiste Pernet
79

Usar um POST em vez de um GET é perfeitamente razoável, pois também instrui o servidor (e gateways ao longo do caminho) a não retornar uma resposta em cache.

Adam Vandenberg
fonte
50

O POST está completamente OK. Diferentemente de GET com POST, você está alterando o estado do sistema (provavelmente seu gatilho está "fazendo" algo e alterando dados).

Eu já usei o POST sem carga útil e "parece" OK. Uma coisa que você deve fazer ao usar o POST sem carga: Passar cabeçalho Content-Length: 0. Lembro-me de problemas com alguns proxies quando o api-client não o passou.

manuel aldana
fonte
16

Se você usa POST / uri sem um corpo, é algo como usar uma função que não aceita argumentos .eg int post (void); portanto, é razoável ter função na sua classe de recurso, que pode alterar o estado de um objeto sem ter um argumento. Se você considera implementar a função de toque Unix para um URI, não é uma boa escolha?

yadab
fonte
6
Toque / dedo é uma ilustração do livro didático de uma ação não idempotente que é inerentemente sem conteúdo.
Chris Marisic
2

Sim, não há problema em enviar uma solicitação POST sem um corpo e, em vez disso, use parâmetros de sequência de caracteres de consulta. Mas tenha cuidado se seus parâmetros contiverem caracteres que não são válidos para HTTP, você precisará codificá-los.

Por exemplo, se você precisar POST 'olá mundo' até o ponto final, precisará fazê-lo parecer assim: http://api.com?param=hello%20world

marko982
fonte
0

O suporte para as respostas de que o POST está OK nesse caso é que, no caso do Python, a estrutura OpenAPI "FastAPI" gera uma GUI do Swagger (veja a imagem) que não contém uma seção Body quando um método (veja o exemplo abaixo) não tem um parâmetro para aceitar um corpo.

o método "post_disable_db" apenas aceita um parâmetro de caminho "db_name" e não possui um segundo parâmetro que implicaria um corpo obrigatório.

@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

insira a descrição da imagem aqui

RaamEE
fonte