Con il design di HTTP (RFC 7230-7235), ciascun endpoint rappresenta una cosa di cui il server tiene traccia, solitamente chiamata Resource
. A volte quella risorsa è solo una cosa (come un singolo widget), ea volte è un gruppo di cose (o widget). L'URI è destinato a essere un identificatore univoco per un widget o un gruppo di widget.
La maggior parte delle API utilizza nomi e ID leggibili dall'uomo per identificare queste cose negli URI. Alcuni servizi orientati alla sicurezza non fanno questo, perché espongono le informazioni agli utenti finali che il servizio non vuole che abbiano. Tra le API leggibili dall'uomo, la convenzione è diventata usare nomi plurali per indicare collezioni, un nome plurale seguito da un identificatore univoco per indicare un singolo elemento in una raccolta. Questi possono nidificare: un singolo oggetto può avere una raccolta o un singolo oggetto che si desidera esporre direttamente. Quindi:
/widgets > all the widgets the user can see
/widgets/12 > a specific widget
/widgets/12/texture > a widget has zero or one textures
/widgets/12/colors > a widget has zero or more colors
/widgets/12/colors/5 > color #5 of widget #12
L'approccio sopra indicato è in genere chiamato RESTful
, anche se REST
è in realtà molto più di questo. L'altro approccio comune è chiamato Remote Procedure Calls
o RPC
in breve. In RPC, gli endpoint rappresentano istruzioni per il server, ad esempio /writeEndOfYearCsv
. Se un cliente dovesse chiamare quell'URL con un POST, la risposta potrebbe eseguire lo streaming di un file CSV con il rapporto di fine anno. RPC sta calando in popolarità perché si crede che sia più difficile da mantenere nel tempo. RPC correttamente scritto utilizzerà solo le chiamate POST e GET.
I parametri di query, definiti in RFC 3986 , vengono utilizzati per restringere i dettagli di una risposta a un URI. Vengono utilizzati più spesso con "risorse di raccolta", ad esempio /widgets?shape=round
, per limitare il contenuto della raccolta. In generale, vengono utilizzati per fornire informazioni al server su come costruire la risposta.
Ad esempio, /widgets/12?expand=texture
potrebbe restituire una risorsa widget con le informazioni sulla trama incorporate in essa, mentre /widgets/12
restituirà solo le proprietà dirette del widget. Un cliente a cui non interessa la trama non deve ottenerlo, e un cliente che si cura può salvare un server colpito ottenendo le informazioni incorporate piuttosto che un semplice collegamento.
In RPC
, dovresti utilizzare i parametri di query per circa la stessa cosa: POST /writeEndOfYearCsv?format=csv
ti darebbe un rapporto CSV, mentre POST /writeEndOfYearCsv?format=xslx
ti darebbe un rapporto Excel.
Il corpo di una richiesta contiene in genere la risorsa che viene creata / modificata (se stai utilizzando un approccio ish REST
) o istruzioni su come elaborare la richiesta (se stai utilizzando un approccio RPC
) . Pertanto, durante la creazione o l'aggiornamento di un widget, la richiesta conterrà tutte le informazioni su cosa costituisce un widget (colori, trama, nome, ecc.). Quando si richiede un rapporto di fine anno, la richiesta può contenere l'anno di richiesta, i client da includere nel rapporto, ecc.
È ancora possibile utilizzare le richieste in stile RPC in un sistema ish REST
. Devi solo pensare alla richiesta stessa come a una risorsa. Pertanto, POST /reports/end-of-year
con un corpo contenente istruzioni creerebbe un nuovo rapporto e potresti visualizzare GET /reports/end-of-year/9
in seguito per visualizzare quel rapporto.
Se sembra che le richieste in stile RPC offuschino pesantemente le linee in termini di dove "appartengono" le cose, è perché lo fanno. Dato che HTTP è stato progettato attorno a un paradigma "URL-as-resource" e RPC è stato spremuto in cima a questo, è spesso compito dei singoli sviluppatori capire dove è il posto giusto per un'istruzione specifica. Se usi RPC (e in generale, dovresti provare a non farlo), individua una regola generale e sii coerente con il tuo servizio su cosa va dove.
Il corpo di una richiesta o di una risposta dipende in genere dal tipo di richiesta. In REST, il corpo e la risposta sono sempre rappresentazioni di risorse, ma a volte tale risorsa è in realtà un'istruzione. Dovresti