È considerata una cattiva pratica eseguire HTTP POST senza il corpo dell'entità?


177

Ho bisogno di invocare un processo che non richiede alcun input da parte dell'utente, solo un trigger. Ho intenzione di utilizzare POST / uri senza un corpo per innescare il processo. Voglio sapere se questo è considerato male da entrambe le prospettive HTTP e REST?


6
Grazie a tutti per i vostri suggerimenti. Anche se tutti hanno dato un suggerimento simile, vale a dire POST con contenuto zero, sto selezionando la risposta di Darrel come corretta a causa del collegamento alla discussione IETF. La discussione chiarisce molto.
Suresh Kumar,

Risposte:


155

Ho posto questa domanda al gruppo di lavoro HTTP IETF alcuni mesi fa. La risposta breve è: NO, non è una cattiva pratica (ma suggerisco di leggere il thread per maggiori dettagli).


4
Qualche fonte aggiornata che lo confermerebbe 10 anni dopo?
Baptiste Pernet,

79

L'uso di un POST anziché di un GET è perfettamente ragionevole, poiché indica anche al server (e ai gateway lungo la strada) di non restituire una risposta memorizzata nella cache.


50

Il POST è completamente OK. A differenza di GET con POST stai cambiando lo stato del sistema (molto probabilmente il tuo trigger sta "facendo" qualcosa e modificando i dati).

Ho usato POST già senza payload e "sembra" OK. Una cosa da fare quando si utilizza POST senza payload: passare l'intestazione Content-Length: 0. Ricordo i problemi con alcuni proxy quando api-client non lo passavo.


16

Se usi POST / uri senza un body è qualcosa come usare una funzione che non accetta un argomento .eg int post (void); quindi è ragionevole avere una funzione per la tua classe di risorse che può cambiare lo stato di un oggetto senza avere un argomento. Se si considera di implementare la funzione touch Unix per un URI, non è forse una buona scelta?


6
Tocco / dito è un'illustrazione da manuale di un'azione non idempotente intrinsecamente senza contenuto.
Chris Marisic,

2

Sì, è OK per inviare una richiesta POST senza un corpo e utilizzare invece i parametri della stringa di query. Ma fai attenzione se i tuoi parametri contengono caratteri che non sono validi HTTP dovrai codificarli.

Ad esempio, se è necessario POST 'ciao mondo' e punto finale dovresti farlo apparire così: http://api.com?param=hello%20world


0

Il supporto per le risposte che POST è OK in questo caso è che nel caso di Python, il framework OpenAPI "FastAPI" genera una GUI Swagger (vedi immagine) che non contiene una sezione Body quando un metodo (vedi esempio sotto) non lo fa avere un parametro per accettare un corpo.

il metodo "post_disable_db" accetta solo un parametro di percorso "nome_db" e non ha un secondo parametro che implicherebbe un corpo obbligatorio.

@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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.