design - restful - spring rest api upload file example



Progetto REST per upload di file (1)

Perché hai bisogno di sessioni? È per motivi di autenticazione e autorizzazione? In tal caso, userei http di basic con SSL o digest . In quanto tale, non esiste una sessione di inizio o di fine, poiché http è stateless e le intestazioni di sicurezza vengono inviate su ogni richiesta.

Il suggerimento di caricare la risorsa sarebbe quello di mappare direttamente come file system privato


# returns all files and subdirs of root dir
GET /{userId}/files
GET /{userId}/files/file1
GET /{userId}/files/dir1
# create or update file
PUT /{userId}/files/file2



Quando carichi il contenuto del file, utilizzerai il tipo di contenuto multipart .

Risposta rivista dopo commento

Progetterei la separazione desiderata tra contenuto di file e carico utile introducendo il collegamento (al contenuto del file) all'interno del carico utile di caricamento. Facilita la struttura delle risorse.

Risorsa di "caricamento" di rappresentanza:


{
  "upload-content" : "http://storage.org/2a34cafa" ,
  "metadata" : "{ .... }" 
}

Azioni di risorse:


# upload file resource
POST /files
-> HTTP 201 CREATED 
-> target location is shown by HTTP header 'Location: /files/2a34cafa

# /uploads as naming feels a bit more natural as /files
POST /sessions/{sessionId}/uploads
-> HTTP 201 CREATED
-> HTTP header: 'Location: /sessions/{sessionId}/uploads/1
-> also returning payload

# Updating upload (like metadata)
/PUT/sessions/{sessionId}/uploads/1 


Devo creare un'API REST per un servizio di caricamento file che consenta a un utente di:

  1. Apri una sessione
  2. Carica un mucchio di file
  3. Chiudi la sessione

E poi più tardi, torna indietro e fai le cose con i file che hanno caricato in una sessione precedente.

Per facilitare la gestione dei dati relativi a ciascun file e la gestione del contenuto del file stesso, questo è lo schema URI che sto pensando di utilizzare:

/sessions/
/sessions/3
/sessions/3/files
/sessions/3/files/5
/sessions/3/file/5/content
/sessions/3/file/5/metadata

Ciò consentirà di trattare i metadati del file separatamente dal contenuto del file. In questo caso, è consentito solo un GET sul contenuto del file e sui metadati del file e per aggiornarne uno, è necessario che un nuovo file sia PUT.

Ha senso ciò? Se no, perché e come potrebbe essere migliore?





api-design