Ottieni più risorse secondarie con un unico endpoint

3

Attualmente sto cercando di creare un'API da utilizzare a fini di reporting. Pertanto, devo solo implementare alcuni endpoint GET .

Nel mio semplice scenario ci sono due risorse. Un evento e il creatore dell'evento. Ogni evento ha un creatore.

Per un report ho bisogno di tutti gli eventi creati tra un determinato intervallo di tempo.

  • GET /api/Events/?start=someStartDate&end=someEndDate

che mi procurerà quegli eventi. Ora ho bisogno anche dei creatori.

Come si può fare senza chiamare GET /api/Creators/{creatorId} per ogni evento restituito dalla prima chiamata (che può essere parecchio)?

Non è possibile passare ID evento in quanto sono Guid s che superano la lunghezza massima dell'URL per GET . Ci sono buone pratiche come un nuovo endpoint? Ma come sarebbe questo endpoint?

Ho anche pensato di includere il creatore direttamente in EventResource . Sfortunatamente, questo mi ha dato anche il mal di testa di un creatore può avere una lista di eventi (che hanno un creatore, che ha eventi, ... e così via).

Avrebbe senso avere due tipi di risorse come una sorta di base-eventresource che ha solo proprietà semplici e una risorsa evento estesa che ha altre risorse incapsulate? Ma dove dovrei disegnare la linea? Inoltre, avrei bisogno di due endpoint per ogni risorsa (base ed estesa) che potrebbero confondere il client.

Spero che qui sia il posto giusto per questo tipo di domande. Forse la soluzione è ovvia ma sono già troppo in profondità per vederlo.

    
posta KingKerosin 27.10.2016 - 16:06
fonte

1 risposta

1

È possibile seguire un approccio simile a quello dell'API JIRA, utilizzando il parametro "expand". Il cliente stesso deciderà, quanto dettagliato deve essere l'informazione e passerà qualche valore "di espansione" al server, richiedendo ulteriori dettagli, come mostrato nei seguenti esempi:

Senza ulteriori dettagli

Il server risponde solo con id e link a sé per i creatori di eventi.

GET /events/?filter1=value1&filter2=value2
[{
    "id" : "124"
    "date" : "12-10-2016",
    "creator" : { 
        "id" : "1" 
        "_links" : [{ "self" : ".../creators/1" }]
    }, 
    "_links" : [{ "self" : ".../events/124" }]
}]

Con informazioni sui creatori

Aggiunge il parametro "espandi" del client:

GET /events/?filter1=value1&filter2=value2&expand=creators
[{
    "id" : "124"
    "date" : "12-10-2016",
    "creator" : { 
        "id" : "1",
        "name" : "John Doe",
        "events" : { 
             "_links" : [{ "self" : ".../creators/1/events" }]
        } 
        "_links" : [{ "self" : ".../creators/1" }]
    }, 
    "_links" : [{ "self" : ".../events/124" }]
}]
    
risposta data 27.10.2016 - 16:31
fonte

Leggi altre domande sui tag