Qual è la migliore struttura URL RESTful per una risorsa ricorsiva?

7

Sto creando un servizio RESTfull per una struttura di risorse ad albero e mi chiedevo quale sarebbe stata la migliore struttura di URL?

Ho tre requisiti:

  1. essere in grado di ottenere una raccolta di root risorse
  2. essere in grado di ottenere un risorsa individuale
  3. essere in grado di ottenere un raccolta di risorse secondarie

Il mio pensiero attuale è:

/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents

Stavo anche pensando di andare al singolare / al plurale per denotare liste o singoli elementi, ma so che avrò una risorsa che è lo stesso plurale che è singolare, quindi ho deciso contro questo.

Qualcuno ha qualche idea su quanto sopra? o hai un modo diverso / migliore di strutturarlo?

    
posta Matt Brailsford 02.12.2010 - 12:12
fonte

2 risposte

9

Ciò che mi viene in mente è: non lasciare che l'API RESTful rifletta la ricorsività nell'URL stesso. Vieni a pensarci, la tua risorsa sono solo i documenti.

Se i documenti sono archiviati fisicamente secondo la struttura ricorsiva, creare un mapping su un ID univoco e utilizzare l'ID nell'URL:

/rest/documents/{id}

Ora, se hai i documenti in questo modo:

| DocumentName | DocumentPath | DocumentID |
--------------------------------------------
| abc          | /abc         | 1          |
| asd          | /abc/asd     | 2          |
| asd          | /asd         | 3          |
| boo          | /abc/asd/boo | 4          |
| hey          | /abc/asd/hey | 5          |

la richiesta consulta questo URL per /abc/asd documento

GET /rest/documents/2

Quindi, ora devi fornire agli utenti della tua API i mezzi per attraversare la tua struttura con poco sforzo. Questo potrebbe essere fatto avvolgendo il tuo payload di risposta (documento) in un oggetto, contenente ulteriori informazioni di attraversamento, come questo:

{
   data: { /* your document goes here */ },
   parent: {"abc": 1 },
   children: [ { "boo": 4 }, { "hey": 5} ]
}

a condizione che ti aspetti che gli utenti non creino troppi documenti in un unico livello, puoi includere un elenco di bambini nella risposta. In caso contrario, potresti offrire all'utente di recuperare ID documento figlio in questo modo, consentendo ad es. per il paging dei risultati tramite parametri querystring:

GET /rest/documents/2/children?page=2&size=50

Infine, parlando dei parametri di querystring, potresti anche fornire le informazioni sul percorso direttamente attraverso i parametri di querystring:

GET /rest/documents?path=somepath&page=1&size=42

Tutti gli approcci menzionati si aspettano che il GET /rest/documents restituisca solo i documenti root.

    
risposta data 08.11.2015 - 01:26
fonte
2

Qualcosa di simile forse:

/rest/{rootEntity}/Item/{leafEntity}/{id}
/rest/{entity}/ItemList
/rest/{entity}/ItemList/{leafEntity}

dove {rootEntity} è il punto di partenza della tua collezione, {leafEntity} è un nodo foglia chiamato all'interno del tuo albero.

Puoi aggiungere alcuni parametri come sopra per selezionare, per esempio, Ultimo o Tutto o qualcosa del genere.

    
risposta data 02.12.2010 - 13:00
fonte

Leggi altre domande sui tag