Risposte diverse in REST

2

Diciamo che ho un endpoint REST che sta restituendo un elenco di persone da qualche luogo, a cui è possibile fare riferimento per indirizzo.

GET /people?address=London

Una risposta potrebbe essere:

[{
   "name":"Jane",
   "age":72
},{
   "name":"John",
   "age": "23"
},
....

Ma diciamo che ci sono persone di Londra nel Regno Unito, ma ci sono anche partite da altri posti (come Londra, Arkansas, Stati Uniti).

Va bene, per questo caso restituisco una risposta completamente diversa?

[{
   "address":"London, UK",
   "count":31
},{
   "address":"London, AK, US",
   "age": "12"
}
....

Questa è una buona pratica? O forse nel secondo caso dovrei impostare un diverso codice di stato?

    
posta Krzysztof Atłasik 06.08.2017 - 18:45
fonte

2 risposte

6

Avere questi tipi completamente diversi di risposte per ciò che è essenzialmente la stessa risorsa renderà estremamente difficile per i destinatari della risposta fare qualcosa di utile con esso.

Un approccio migliore sarebbe essenzialmente quello di unire le due risposte:

[{
  "address":"London, UK",
  "count":31,
  "people":[{
    "name":"Jane",
    "age":72
  },{
   "name":"John",
   "age": "23"
  },
  ....
  ]
},{
 "address":"London, AK, US",
 "count": "12",
 "people": [
   ...
 ]
}
....      

Se ora disponi di una sola città corrispondente, puoi restituire un array con un singolo elemento e mantenere comunque la stessa struttura.

    
risposta data 06.08.2017 - 19:03
fonte
3

La risposta breve è no, non è una buona pratica. Si rompe legge di Postel . Come @Bart come commentato, sarebbe difficile lavorare con l'API.

La combinazione di entrambe le risposte sembra appropriata, ma dipende dalla rappresentanza effettiva people .

In alternativa alla risposta di @ Bart, presumo che /people -senza filtri- non crei alcun tipo di raggruppamento.

Più facile sarebbe consentire agli utenti di aggiungere più filtri. Ad esempio:

Prima chiamata

GET /people?address=London

{
  "count": 2,
  [
    { "name":"Jane", "age":72, "address": "London, UK"},
    { "name":"Jhon", "age":18, "address": "London, AK, US"}
  ]
}

Seconda chiamata

GET /people?address=London,UK

{
  "count": 1,
  [
    { "name":"Jane", "age":72, "address": "London, UK"}
  ]
}

In questo modo, la rappresentazione di /people rimane la stessa sempre, con o senza filtri. E, naturalmente, il codice di stato è sempre lo stesso.

Tieni presente che ho separato London e UK da coma. Non so se gli indirizzi sono normalizzati o meno. Se lo fossero, potremmo aggiungere un altro parametro di richiesta. Come per esempio ?address=X&country=Y .

    
risposta data 06.08.2017 - 22:31
fonte

Leggi altre domande sui tag