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.


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).


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.


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.


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?


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.