É 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?
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).
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.
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.
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?
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.
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
Respostas:
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).
fonte
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.
fonte
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.fonte
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?
fonte
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
fonte
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.
fonte