Rozwijamy serwer z interfejsem API REST, który przyjmuje i odpowiada za pomocą JSON. Problem polega na tym, że jeśli chcesz przesłać obrazy z klienta na serwer.
Uwaga: mówię również o przypadku użycia, w którym podmiot (użytkownik) może mieć wiele plików (carPhoto, licensePhoto), a także mieć inne właściwości (imię i nazwisko, adres e-mail ...), ale kiedy tworzysz nowego użytkownika, nie nie wysyłają tych zdjęć, są one dodawane po procesie rejestracji.
Znane mi rozwiązania, ale każde z nich ma pewne wady
1. Użyj danych wieloczęściowych / formularzy zamiast JSON
dobrze : Żądania POST i PUT są tak RESTful jak to możliwe, mogą zawierać dane tekstowe wraz z plikiem.
Wady : To już nie jest JSON, który jest znacznie łatwiej testować, debugować itp. w porównaniu do danych wieloczęściowych / formularzy
2. Pozwól zaktualizować osobne pliki
Żądanie POST dotyczące utworzenia nowego użytkownika nie pozwala na dodawanie zdjęć (co jest ok w naszym przypadku użycia, jak powiedziałem na początku), przesyłanie zdjęć odbywa się za pomocą żądania PUT jako multipart / form-data na przykład / users / 4 / carPhoto
dobrze : wszystko (oprócz samego przesyłania pliku) pozostaje w JSON, jest łatwe do testowania i debugowania (możesz rejestrować pełne żądania JSON bez obawy o ich długość)
Wady : nie jest intuicyjne, nie można jednocześnie POST lub PUT wszystkich zmiennych bytu, a także ten adres /users/4/carPhoto
można traktować bardziej jako zbiór (wygląda to tak jak w przypadku standardowego interfejsu API REST /users/4/shipments
). Zwykle nie możesz (i nie chcesz) GET / PUT każdej zmiennej bytu, na przykład users / 4 / name. Możesz uzyskać nazwę za pomocą GET i zmienić ją za pomocą PUT na users / 4. Jeśli po identyfikatorze jest coś, zwykle jest to inna kolekcja, na przykład users / 4 / reviews
3. Użyj Base64
Wyślij jako JSON, ale koduj pliki za pomocą Base64.
dobrze : Tak samo jak pierwsze rozwiązanie, jest to usługa RESTful, jak to możliwe.
Wady : Po raz kolejny testowanie i debugowanie jest znacznie gorsze (ciało może mieć megabajty danych), zwiększa się rozmiar, a także czas przetwarzania zarówno w kliencie, jak i serwerze
Naprawdę chciałbym skorzystać z rozwiązania no. 2, ale ma swoje wady ... Czy ktoś może lepiej zrozumieć rozwiązanie „co jest najlepsze”?
Moim celem jest udostępnienie usług RESTful przy możliwie jak największej liczbie standardów, a ja chcę, aby było to tak proste, jak to możliwe.