Wird es als schlechte Praxis angesehen, HTTP-POST ohne Entitätskörper durchzuführen?

176

Ich muss einen Prozess aufrufen, für den keine Benutzereingaben erforderlich sind, sondern nur ein Auslöser. Ich plane, POST / uri ohne Körper zu verwenden, um den Prozess auszulösen. Ich möchte wissen, ob dies sowohl aus HTTP- als auch aus REST-Sicht als schlecht angesehen wird.

Suresh Kumar
quelle
6
Vielen Dank an alle für Ihre Vorschläge. Obwohl alle ähnliche Vorschläge gemacht haben, dh es ist in Ordnung, mit null Inhalt zu POSTEN, wähle ich Darrels Antwort aufgrund des Links zur IETF-Diskussion als richtig aus. Die Diskussion klärt viel.
Suresh Kumar

Antworten:

154

Ich habe diese Frage vor einigen Monaten in der IETF-HTTP-Arbeitsgruppe gestellt. Die kurze Antwort lautet: NEIN, es ist keine schlechte Praxis (aber ich empfehle, den Thread für weitere Details zu lesen).

Darrel Miller
quelle
3
Gibt es eine aktualisierte Quelle, die dies 10 Jahre später bestätigen würde?
Baptiste Pernet
79

Die Verwendung eines POST anstelle eines GET ist durchaus sinnvoll, da der Server (und die Gateways auf dem Weg) angewiesen werden, keine zwischengespeicherte Antwort zurückzugeben.

Adam Vandenberg
quelle
50

POST ist völlig in Ordnung. Im Unterschied zu GET und POST ändern Sie den Status des Systems (höchstwahrscheinlich "tut" Ihr Trigger etwas und ändert Daten).

Ich habe POST bereits ohne Nutzlast verwendet und es "fühlt" sich OK an. Eine Sache, die Sie tun sollten, wenn Sie POST ohne Nutzlast verwenden: Übergeben Sie den Header Content-Length: 0. Ich erinnere mich an Probleme mit einigen Proxys, als ich den API-Client nicht bestanden habe.

Manuel Aldana
quelle
16

Wenn Sie POST / uri ohne Body verwenden, ist dies so etwas wie die Verwendung einer Funktion, die kein Argument akzeptiert .eg int post (void); Daher ist es sinnvoll, eine Funktion für Ihre Ressourcenklasse zu haben, die den Status eines Objekts ohne Argument ändern kann. Wenn Sie die Unix-Touch-Funktion für einen URI implementieren möchten, ist dies nicht eine gute Wahl?

Yadab
quelle
6
Touch / Finger ist eine Lehrbuchillustration einer nicht idempotenten Aktion, die von Natur aus inhaltslos ist.
Chris Marisic
2

Ja, es ist in Ordnung, eine POST-Anforderung ohne Text zu senden und stattdessen Abfragezeichenfolgenparameter zu verwenden. Seien Sie jedoch vorsichtig, wenn Ihre Parameter Zeichen enthalten, die nicht HTTP-gültig sind, müssen Sie sie codieren.

Wenn Sie beispielsweise "Hallo Welt" an und Endpunkt POSTEN müssen, müssen Sie es so aussehen lassen: http://api.com?param=hello%20world

marko982
quelle
0

Die Antwort, dass POST in diesem Fall in Ordnung ist, wird dadurch unterstützt, dass in Pythons Fall das OpenAPI-Framework "FastAPI" eine Swagger-GUI (siehe Bild) generiert, die keinen Body-Abschnitt enthält, wenn eine Methode (siehe Beispiel unten) dies nicht tut einen Parameter haben, um einen Körper zu akzeptieren.

Die Methode "post_disable_db" akzeptiert nur einen Pfadparameter "db_name" und hat keinen zweiten Parameter, der einen obligatorischen Body implizieren würde.

@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

Geben Sie hier die Bildbeschreibung ein

RaamEE
quelle