Best practice per l'API REST: argomenti nella stringa di query rispetto al corpo della richiesta


126

Un'API REST può avere argomenti in diversi posti:

  1. Nel corpo della richiesta : come parte di un corpo json o altro tipo MIME
  2. Nella stringa di query - ad es/api/resource?p1=v1&p2=v2
  3. Come parte del percorso dell'URL, ad es/api/resource/v1/v2

Quali sono le migliori pratiche e considerazioni per scegliere tra 1 e 2 sopra?
2 vs 3 è coperto qui .



Oltre a quanto sopra, che ne dici di usare l'intestazione?
variabile

Risposte:


40

Quali sono le migliori pratiche e considerazioni per scegliere tra 1 e 2 sopra?

Di solito il corpo del contenuto viene utilizzato per i dati che devono essere caricati / scaricati al / dal server e i parametri di query vengono utilizzati per specificare i dati esatti richiesti. Ad esempio, quando carichi un file ne specifichi il nome, il tipo MIME, ecc. Nel corpo, ma quando recuperi l'elenco dei file puoi utilizzare i parametri di query per filtrare l'elenco in base a qualche proprietà dei file. In generale, i parametri della query sono proprietà della query e non dei dati.

Ovviamente questa non è una regola rigida: puoi implementarla in qualsiasi modo ritieni più appropriato / che funzioni per te.

Potresti anche voler controllare l' articolo di wikipedia sulla stringa di query , in particolare i primi due paragrafi.


1
Una ragione ragionevole per la tua analisi di cui sopra è che le operazioni idempotenti sono meglio conservate nelle stringhe di query dell'URL e CRUD è meglio conservato in corpi di risposta strettamente tipizzati, che essenzialmente trae vantaggio dalle SOP e previene forme di base di ingegneria sociale / attacchi di phishing
Rice

16

Presumo che tu stia parlando di richieste POST / PUT. Semanticamente il corpo della richiesta dovrebbe contenere i dati che stai postando o correggendo.

La stringa di query, come parte dell'URL (un URI), serve per identificare la risorsa che stai pubblicando o correggendo.

Hai chiesto una best practice, le seguenti semantiche sono mie. Ovviamente l'uso delle tue regole pratiche dovrebbe funzionare, specialmente se il framework web che usi lo riassume in parametri .

Tu sai di più:

  • Alcuni server Web hanno limiti sulla lunghezza dell'URI.
  • Puoi inviare parametri all'interno del corpo della richiesta con CURL.
  • La posizione in cui invii i dati non dovrebbe avere effetto sul debug.

6

Le seguenti sono le mie regole pratiche ...

Quando usare il corpo:

  • Quando gli argomenti non hanno una chiave semplice: struttura del valore
  • Se i valori non sono leggibili dall'uomo, come i dati binari serializzati
  • Quando hai un numero molto elevato di argomenti

Quando utilizzare la stringa di query:

  • Quando gli argomenti sono tali da volerli vedere durante il debug
  • Quando vuoi essere in grado di chiamarli manualmente durante lo sviluppo del codice, ad esempio con curl
  • Quando gli argomenti sono comuni a molti servizi web
  • Quando stai già inviando un tipo di contenuto diverso come application/octet-stream

Nota che puoi mescolare e abbinare: metti quelli comuni, quelli che dovrebbero essere debugabili nella stringa di query e getta tutto il resto nel json.


34
Selezionare come strutturare l'API in base alla praticità dello sviluppo non è una buona pratica.
Eric Stein

1
Come ha detto @EricStein, hai capito al contrario.
DanMan

20
Ragazzi, il motivo per cui ho posto la domanda è ottenere la risposta giusta. Vai avanti, scrivi una risposta e rimuoverò la mia difettosa. @EricStein
Jonathan

4
@ Jonathan le API che sono facili da consumare con le mani umane sono quasi sempre buone API. Complimenti per aver chiamato accuratamente KISS
Chris Marisic

1
@AkshayHiremath Si riferisce al fatto che potresti inviare qualcos'altro nel corpo, ad esempio se hai inviato un'intestazione ContentType come "immagine / jpeg" avresti bisogno che il corpo del tuo messaggio contenga i dati jpeg e non potresti includere nient'altro in esso
Shayaan
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.