JSON REST Risposte e oggetti incorporati

1

Ho fatto delle ricerche sulle architetture RESTful e sulle risposte JSON. Sto cercando di capire quale metodo di presentazione delle risposte JSON è "corretto" o se sono entrambi accettabili.

Ad esempio, utilizzando swapi , ho visto le risposte JSON che fanno riferimento agli URI per gli oggetti incorporati:

{
  "name": "Luke Skywalker",
  "height": "172",
  "mass": "77",
  "hair_color": "blond",
  "skin_color": "fair",
  "eye_color": "blue",
  "birth_year": "19BBY",
  "gender": "male",
  "homeworld": "https://swapi.co/api/planets/1/",
  "films": [
    "https://swapi.co/api/films/2/",
    "https://swapi.co/api/films/6/",
    "https://swapi.co/api/films/3/",
    "https://swapi.co/api/films/1/",
    "https://swapi.co/api/films/7/"
  ],
  "species": [
    "https://swapi.co/api/species/1/"
  ],
  "vehicles": [
    "https://swapi.co/api/vehicles/14/",
    "https://swapi.co/api/vehicles/30/"
  ],
  "starships": [
    "https://swapi.co/api/starships/12/",
    "https://swapi.co/api/starships/22/"
  ],
  "created": "2014-12-09T13:50:51.644000Z",
  "edited": "2014-12-20T21:17:56.891000Z",
  "url": "https://swapi.co/api/people/1/"
}

Ho visto altre risposte JSON formattate come segue, dove l'oggetto è "incorporato" nella risposta - vedi "homeworld" di seguito:

{
  "name": "Luke Skywalker",
  "height": "172",
  "mass": "77",
  "hair_color": "blond",
  "skin_color": "fair",
  "eye_color": "blue",
  "birth_year": "19BBY",
  "gender": "male",
  "homeworld": {
    "name": "Tatooine", 
    "rotation_period": "23", 
    "orbital_period": "304", 
    "diameter": "10465", 
    "climate": "arid", 
    "gravity": "1 standard", 
    "terrain": "desert", 
    "surface_water": "1", 
    "population": "200000"
  },
  "created": "2014-12-09T13:50:51.644000Z",
  "edited": "2014-12-20T21:17:56.891000Z",
  "url": "https://swapi.co/api/people/1/"
}

Uno di questi è considerato più "corretto" rispetto all'altro, oppure è realmente basato sui requisiti della particolare soluzione?

    
posta mainstringargs 10.09.2018 - 17:01
fonte

2 risposte

2

Come per molti problemi di progettazione, la risposta è "dipende".

Nella maggior parte dei casi devi trovare un equilibrio tra:

  1. Grande risposta: incorpora tutto, anche se alcuni client non lo usano
  2. Molte richieste: non incorporare nulla e lasciare che i client facciano una richiesta in più per ogni risorsa aggiuntiva di cui hanno bisogno.

Non penso che uno di questi sia "più corretto" dell'altro.

Esistono alcuni standard come API JSON e HAL questo tentativo (tra le altre cose) di risolvere questo problema. Entrambi hanno il concetto di risorse "incluse" (o incorporate) richieste dal cliente, ad es. per API JSON

Se richiedi GET /articles , riceverai:

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!",
      "body": "The shortest article. Ever.",
      "created": "2015-05-22T14:56:29.000Z",
      "updated": "2015-05-22T14:56:28.000Z"
    },
    "relationships": {
      "author": {
        "data": {"id": "42", "type": "people"},
        "links": {
          "self": "http://example.com/articles/1/author"
        }
      }
    }
  }]
}

E potresti anche fare GET /articles?include=author

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!",
      "body": "The shortest article. Ever.",
      "created": "2015-05-22T14:56:29.000Z",
      "updated": "2015-05-22T14:56:28.000Z"
    },
    "relationships": {
      "author": {
        "data": {"id": "42", "type": "people"},
        "links": {
          "self": "http://example.com/articles/1/author"
        }
      }
    }
  }],
  "included": [
    {
      "type": "people",
      "id": "42",
      "attributes": {
        "name": "John",
        "age": 80,
        "gender": "male"
      }
    }
  ]
}

Che aggiunge una chiave "inclusa" che contiene più risorse. In questo modo il cliente può decidere per ogni caso d'uso.

Ovviamente, questo pone un ulteriore onere nel client per analizzare la risposta poiché è più complessa di semplici strutture di dati (ci sono liberia per questo).

Ecco alcune letture utili:

risposta data 10.09.2018 - 21:49
fonte
2

Il secondo approccio di "Embedded Objects" è più esteso e amp; utile quando si lavora con strutture JSON complesse. Una struttura JSON potrebbe contenere uno o più dei seguenti tipi : stringa, numero, oggetto, matrice, vero, falso o null . Essendo Object una struttura JSON, significa che un JSON è pensato come struttura complessa di oggetti coppia-valore-chiave annidati come richiesto. Un'altra cosa, ripetere lo stesso URL di base dell'esempio SWAPI non è considerata una buona pratica.

    
risposta data 10.09.2018 - 18:05
fonte

Leggi altre domande sui tag