Stiamo sviluppando un server con API REST, che accetta e risponde con JSON. Il problema è, se è necessario caricare immagini dal client al server.
Nota: e sto anche parlando di un caso d'uso in cui l'entità (utente) può avere più file (carPhoto, licensePhoto) e anche altre proprietà (nome, e-mail ...), ma quando si crea un nuovo utente, si non inviare queste immagini, vengono aggiunte dopo il processo di registrazione.
Le soluzioni di cui sono a conoscenza, ma ognuna di esse presenta alcuni difetti
1. Utilizzare multipart / form-data anziché JSON
buono : le richieste POST e PUT sono il più RESTful possibile, possono contenere input di testo insieme al file.
contro : Non è più JSON, che è molto più facile da testare, eseguire il debug, ecc. rispetto ai dati multipart / form
2. Consentire di aggiornare file separati
La richiesta POST per la creazione di un nuovo utente non consente di aggiungere immagini (il che è ok nel nostro caso d'uso come ho detto all'inizio), il caricamento delle immagini viene effettuato dalla richiesta PUT come multipart / form-data, ad esempio / users / 4 / carPhoto
buono : tutto (tranne il caricamento del file stesso) rimane in JSON, è facile da testare ed eseguire il debug (puoi registrare richieste JSON complete senza aver paura della loro lunghezza)
contro : Non è intuitivo, non puoi POST o PUT tutte le variabili di entità contemporaneamente e anche questo indirizzo /users/4/carPhoto
può essere considerato più come una raccolta (il caso d'uso standard per l'API REST è simile a questo /users/4/shipments
). Di solito non puoi (e non vuoi) OTTENERE / METTERE ogni variabile di entità, ad esempio utenti / 4 / nome. Puoi ottenere il nome con GET e modificarlo con PUT su users / 4. Se c'è qualcosa dopo l'id, di solito è un'altra raccolta, come utenti / 4 / recensioni
3. Utilizzare Base64
Invialo come JSON ma codifica i file con Base64.
buono : come la prima soluzione, è il servizio RESTful possibile.
contro : Ancora una volta, i test e il debug sono molto peggiori (il corpo può avere megabyte di dati), c'è un aumento delle dimensioni e anche dei tempi di elaborazione sia in client che in server
Vorrei davvero usare la soluzione no. 2, ma ha i suoi contro ... Chiunque può darmi una visione migliore della soluzione "qual è la migliore"?
Il mio obiettivo è avere servizi RESTful con il maggior numero possibile di standard inclusi, mentre voglio renderlo il più semplice possibile.