Best practice per un'API REST-ful in cui gli oggetti avrebbero naturalmente un "/" nel loro identificatore

2

Sto progettando un REST API per un sistema di gestione dei documenti . Per rendere l'API più naturale, ho pensato di utilizzare l'identificatore naturale per un file, che è il suo percorso (di solito con barre "/" in avanti), e non qualcosa come un ID artificiale come un UUID.

Ovviamente, un utente identifica un file tramite il suo percorso:

/path/to/file.txt

Sfortunatamente, questo si scontra con una progettazione API comune e buona.

Funzionerebbe:

Retrieving a file: GET /api/v1/files/<path/to/file.txt>

Tuttavia, altri metodi che vorresti avere diventeranno un po 'problematici:

Retrieving a file list of a folder: GET /api/v1/folders/<path/to/folder>/files

I miei pensieri finora:

  • evita gli identificatori univoci con "/" interamente e usa un UUID artificiale (come Alfresco usa NodeId / NodeRefs). Ciò aggiungerebbe un altro livello di astrazione ad esso, dove un ID univoco non è molto naturale dal punto di vista del dominio aziendale
  • non utilizzare l'identificatore nel percorso dell'URL ma in un parametro (rispetto ai buoni schemi di progettazione dell'API)
  • (richiedere agli utenti API di sostituire / con un altro personaggio ovviamente non è un'opzione)

Naturalmente, i file e le cartelle così come li conosciamo da un file system, sono naturalmente identificati dal suo percorso. In quel caso particolare, si potrebbe obiettare che se qualcuno vuole usare il percorso come identificatore, piuttosto che il modo corretto di farlo:

Retrieving a file: GET /api/v1/files/<path/to/file.txt>

in realtà sarebbe:

Retrieving a file: GET /api/v1/folders/<path>/folders/<to>/files/<file.txt>

se vogliamo essere veramente corretti qui.

Aggiornamento: voglio chiedere alla community le migliori pratiche ed esperienze qui - specialmente quando Dropbox e Google Drive utilizzano entrambi due approcci diversi (vedi prima risposta e commenti sotto): DropBox sta utilizzando il percorso mentre Google Drive è utilizzando gli ID.

    
posta Mathias Conradt 24.07.2015 - 18:55
fonte

3 risposte

6

Potresti esaminare il modo API di Google Drive per gestirlo. Nel loro caso, i percorsi sono astrazioni e i file sono selezionati da id.

Un file è una risorsa. Può appartenere a una cartella, quindi ha una proprietà 'Parents'. Può appartenere a più cartelle (come elemento condiviso o simulare soft link), quindi può avere più "Genitori". Può essere spostato in una "cartella" diversa, nel qual caso la risorsa reale non cambia posizione: la sua proprietà dei genitori è appena cambiata. Il nome file non viene utilizzato nell'URI, poiché un ID è univoco e una stringa può avere caratteri dispari.

    
risposta data 24.07.2015 - 19:03
fonte
2

Dimentica i file per un momento.

Hai un'API e ad un certo punto devi inserire identificatori specifici per la tua applicazione. Poiché la tua applicazione non è principalmente interessata alle funzionalità dell'API e poiché questi identificatori sono determinati senza nemmeno conoscere l'API, devi essere in grado di tradurre un identificatore arbitrario in qualcosa che l'API può gestire.

C'è un meccanismo standard per questo, che è la codifica percentuale. Gestisce tutti questi casi fastidiosi come identificatori contenenti barre, sempre di meno. Ad esempio, sul mio Mac, /"what</do">you think/"about>>this è un percorso perfettamente valido con i tre componenti del percorso "what< , do">you think e "about>>this . La codifica percentuale non ha problemi con questo.

    
risposta data 26.07.2015 - 11:29
fonte
1

Prima di tutto

/api/v1/someresource

in realtà non è un buon progetto di API REST. La versione di api non dovrebbe essere nel percorso di una risorsa. Una risorsa è solo una risorsa. La versione della struttura dati che rappresenta la risorsa dovrebbe essere nel tempo MIME. Ad esempio quando vai su una pagina web non hai URL come questo

www.newyorktimes.com/html5/headlines
www.newyorktimes.com/html2.1/headlines

hai solo questo

www.newyorktimes.com/headlines

E il browser calcola se può visualizzare HTML5 o HTML2 o XML o che mai i rapporti di ricerca possono restituire per quella risorsa. La versione di HTML utilizzata è nella meta informazione per la rappresentazione della risorsa headlines .

Quindi non farlo con la tua API. Se esiste una versione 1 di una risorsa e una versione 2 di tale record di risorse nel tempo mimo della risorsa. Se si prevede che il client conosca l'ubicazione delle risorse in base alla versione dell'API, non si seguirà REST. Dovresti essere in grado di spostare una risorsa in un'altra posizione senza dover utilizzare la versione dell'API.

Non c'è niente di sbagliato quindi con l'URI

www.myserver.com/files/path/to/file.txt

o anche solo

www.myserver.com/path/to/file.txt

se questo ha senso per quanto riguarda la struttura delle risorse. Questo è il modo in cui i file statici sono serviti su un server web e ha funzionato bene per decenni.

    
risposta data 29.07.2015 - 12:37
fonte

Leggi altre domande sui tag