Qual è il modo migliore per restituire un array come risposta in un'API RESTful?

30

Supponiamo di avere risorse come questa,

book:
    type: object
    properties:
        author: {type: string}
        isbn: {type: string}
        title: {type: string}

books:
    type: array
    items: book

Quindi, quando qualcuno fa un GET sulla risorsa libri, dovremmo restituire il seguente

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
 {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

Ho sentito da qualcuno al lavoro che la pratica REST raccomandata è di restituire sempre le risposte come oggetti JSON, il che significherebbe che il nostro schema per books sarebbe simile a questo,

books:
    type: object
    properties:
        list:
            type: array
            items: book

Quindi, ora, la risposta sarebbe simile a questa,

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
             {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

Quale di questi è la migliore pratica REST?

    
posta borncrusader 09.06.2015 - 19:51
fonte

6 risposte

29

In pratica, la seconda opzione è la migliore pratica. Il motivo è che non è possibile estendere la risorsa quando si restituisce un array.

Ad esempio: se è necessario aggiungere un conteggio di tutti i record che sono già stati eseguiti con l'approccio solo dell'array.

Se ciò accade in un elenco di API, devi mantenerlo coerente, quindi crea un oggetto, quindi la tua API diventa più coerente e più facile da usare per gli sviluppatori.

Ad esempio: supponiamo che uno sviluppatore scriva codice generico per utilizzare la tua API per mostrare le pagine di elenco e di dettaglio. Non vuole creare un'eccezione perché a volte è una matrice e talvolta è un oggetto con una proprietà di lista.

Questa risposta in totale non ha nulla a che vedere con i principi del riposo, degli hateo e di altri protocolli, ma solo di essere reali sui dati che devi inviare al cliente. Se decidi di seguire per esempio gli hateos, allora si atterranno ai loro standard (che sono anche gli oggetti btw).

    
risposta data 09.12.2015 - 14:45
fonte
8

Il motivo per cui rendi la tua risposta conforme a JSON è che JSON è uno standard defacto; qualsiasi linguaggio con un parser JSON può analizzarlo banalmente, e se usi JavaScript, non lo fai nemmeno è necessario un parser poiché JavaScript lo comprende in modo nativo.

In altre parole, rendilo conforme a JSON e non dovrai scrivere il tuo parser. Inoltre, non ci saranno sorprese quando il prossimo sviluppatore scrive software che consuma il servizio.

REST non ha nulla a che fare con il tuo schema JSON. Entrambi gli schemi sono accettabili, da una prospettiva REST.

    
risposta data 09.06.2015 - 20:10
fonte
7

Entrambi

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},{"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

e

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
         {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

sono Json validi. Non penso che dovresti aggiungere "elenco" se non è necessario, potrebbe anche essere confuso perché quello che segue è un array, invece di un elenco.

La migliore pratica REST? L'API dovrebbe fornire una risposta adeguata a qualsiasi impostazione nell'intestazione Accept e anche una buona documentazione.

    
risposta data 10.06.2015 - 08:15
fonte
4

Un dizionario con una sola chiave "lista" senza significato e un valore di matrice non ha senso - restituisce invece una matrice.

Se lo stesso servizio può restituire libri, CD o DVD, è possibile restituire un dizionario con una chiave "libri" e un valore di matrice. Potrebbe esserci un altro "DVD" chiave con una serie di DVD. Ad esempio se un cliente può chiedere un elenco di tutti i suoi acquisti.

Se sei certo che la risposta verrà interpretata solo come un elenco di libri (se la richiesta dicesse "dammi un elenco di libri"), allora solo un array va bene.

    
risposta data 09.12.2015 - 12:30
fonte
4

La seconda opzione è anche il metodo preferito per motivi di sicurezza. I browser meno recenti presentano una vulnerabilità di sicurezza che consente ad altri codici javascript nella pagina Web di rubare i dati se vengono restituiti come array JSON. Quindi, storicamente, la migliore pratica era quella di non restituire gli array JSON. In effetti, c'erano alcuni framework la cui funzione "json-ify" sceglie l'opzione 2 di default quando passi in una matrice.

link

link

    
risposta data 05.08.2016 - 07:39
fonte
1

entrambi sono json e aderiscono a REST. Renderei la risposta più descrittiva, nel tuo caso cambi la lista dei libri. O qualcosa del genere:

{ "responceObject" : {

   results : 2,

    "Books": [
        {"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
        {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}
    ]

}}
    
risposta data 09.12.2015 - 15:52
fonte

Leggi altre domande sui tag