Est-il considéré comme une mauvaise pratique d'effectuer HTTP POST sans corps d'entité?

177

J'ai besoin d'invoquer un processus qui ne nécessite aucune entrée de l'utilisateur, juste un déclencheur. Je prévois d'utiliser POST / uri sans corps pour déclencher le processus. Je veux savoir si cela est considéré comme mauvais du point de vue HTTP et REST?

Suresh Kumar
la source
6
Merci à tous pour vos suggestions. Bien que tout le monde ait donné une suggestion similaire, c'est-à-dire qu'il est correct de POST sans contenu, je sélectionne la réponse de Darrel comme correcte en raison du lien vers la discussion de l'IETF. La discussion clarifie beaucoup.
Suresh Kumar

Réponses:

155

J'ai posé cette question sur le groupe de travail HTTP de l'IETF il y a quelques mois. La réponse courte est: NON, ce n'est pas une mauvaise pratique (mais je suggère de lire le fil pour plus de détails).

Darrel Miller
la source
4
Une source mise à jour qui confirmerait cela 10 ans plus tard?
Baptiste Pernet
79

Utiliser un POST au lieu d'un GET est parfaitement raisonnable, car il demande également au serveur (et aux passerelles en cours de route) de ne pas renvoyer une réponse mise en cache.

Adam Vandenberg
la source
50

POST est complètement OK. À la différence de GET avec POST, vous changez l'état du système (votre déclencheur est probablement "faire" quelque chose et changer les données).

J'ai déjà utilisé POST sans charge utile et ça "se sent" OK. Une chose que vous devez faire lorsque vous utilisez POST sans charge utile: Passer l'en-tête Content-Length: 0. Je me souviens de problèmes avec certains proxys lorsque je ne l'ai pas passé avec le client api.

Manuel Aldana
la source
16

Si vous utilisez POST / uri sans corps, cela revient à utiliser une fonction qui ne prend pas d'argument .eg int post (void); il est donc raisonnable d'avoir une fonction pour votre classe de ressources qui peut changer l'état d'un objet sans avoir d'argument. Si vous envisagez d'implémenter la fonction tactile Unix pour un URI, n'est-ce pas un bon choix?

yadab
la source
6
Touch / finger est une illustration classique d'une action non idempotente qui est par nature sans contenu.
Chris Marisic
2

Oui, vous pouvez envoyer une requête POST sans corps et utiliser à la place des paramètres de chaîne de requête. Mais attention si vos paramètres contiennent des caractères qui ne sont pas valides HTTP vous devrez les encoder.

Par exemple, si vous avez besoin de POST 'hello world' vers un point final, vous devrez le faire ressembler à ceci: http://api.com?param=hello%20world

marko982
la source
0

Le support pour les réponses que POST est OK dans ce cas est que dans le cas de Python, le framework OpenAPI "FastAPI" génère une interface graphique Swagger (voir image) qui ne contient pas de section Body lorsqu'une méthode (voir exemple ci-dessous) ne avoir un paramètre pour accepter un corps.

la méthode "post_disable_db" accepte juste un paramètre de chemin "db_name" et n'a pas de 2ème paramètre qui impliquerait un corps obligatoire.

@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

entrez la description de l'image ici

RaamEE
la source