Va bene usare POST per gli aggiornamenti dell'API REST?

2

Per un po 'di tempo ho usato PUT o PATCH per aggiornare una risorsa API REST. Dopo aver usato molte chiamate PUT / PATCH ho notato che l'aggiornamento poteva essere fatto anche con il POST.

Ecco un esempio semplificato che spero possa spiegare la situazione. C'è un endpoint / api / automobili / concessionari / 1 con una risorsa

{
 "id": 1,
 "dealer_name": "Audi Atlanta",
 "year_opened": 2010,
 "contact_persons":
[
{
  "contact_person_type": "main_contact",
  "contact_person_name": "Mike Smith"
},
{
  "contact_person_type": "billing_contact",
  "contact_person_name": "Luke Johnson"
}
]
}

Sarebbe contro le linee guida dell'API REST se aggiorno questa risorsa con POST come

{
  "contact_to_change": "main_contact",
  "contact_name": "John Smith"
}

invece di PATCH con

{
 "id": 1,
 "contact_persons":
[
{
  "contact_person_type": "main_contact",
  "contact_person_name": "Mike Smith"
}
]
}

o invece di aggiornamento completo delle risorse con PUT

Si noti come la struttura del carico utile è completamente diversa dalla struttura della risorsa stessa. Ci sono casi in cui questo è molto più facile quindi andare con un aggiornamento delle risorse raw seguendo la stessa struttura del corpo.

Potrebbe in questo modo portare qualche problema che non vedo al momento?

    
posta John 25.04.2017 - 10:18
fonte

2 risposte

1

Puoi utilizzare POST per aggiornare una risorsa ma non utilizzare lo stesso URL della risorsa che stai aggiornando. Quindi, se l'URL da utilizzare con PUT / PATCH è /api/cars/dealers/1 , avresti /api/cars/dealerupdates per inviare le tue richieste POST con il corpo come nella tua richiesta PATCH.

In questo modo è chiaro che non stai creando una nuova entità sotto /api/cars/dealers/ o /api/cars/dealers/1 . Ciò che è stato creato è una nuova entità di aggiornamento che verrà applicata ad un certo punto all'entità all'interno della richiesta. Un altro modo per vederlo è: l'invio della richiesta GET a /api/cars/dealerupdates può fornire un elenco di aggiornamenti che sono stati elaborati.

    
risposta data 25.04.2017 - 11:35
fonte
0

dipende un po 'dalla semantica dei tuoi messaggi

un POST to / api / cars / dealers / 1 / update andrebbe bene dato che stai inviando una nuova richiesta di aggiornamento (e la semantica cambia leggermente poiché la richiesta di aggiornamento potrebbe o non potrebbe essere elaborata in un secondo momento)

Potresti anche pubblicare diversi aggiornamenti strutturati su / api / cars / dealers / 1 / update. Ciò sarebbe più simile a un tipo di architettura CQRS in cui le query sarebbero separate dai comandi (aggiornamenti) e quindi i comandi sono strutturati in base alle proprie entità.

ma in generale un POST dovrebbe creare qualcosa, sia una nuova persona di contatto (post su / api / automobili / rivenditori / 1 / contatto) o una nuova richiesta di aggiornamento.

    
risposta data 25.04.2017 - 11:44
fonte

Leggi altre domande sui tag