To prawdopodobnie będzie głupie pytanie, ale mam jedną z tych nocy. W aplikacji tworzę RESTful API i chcemy, aby klient wysyłał dane jako JSON. Część tej aplikacji wymaga od klienta przesłania pliku (zwykle obrazu) oraz informacji o obrazie.
Trudno mi wyśledzić, jak to się dzieje w jednym żądaniu. Czy możliwe jest Base64 danych pliku w ciągu JSON? Czy będę musiał wykonać 2 posty na serwerze? Czy nie powinienem do tego używać JSON?
Na marginesie, używamy Grails na backendie i do tych usług mają dostęp natywni klienci mobilni (iPhone, Android itp.), Jeśli coś z tego robi różnicę.
json
rest
grails
file-upload
Gregg
źródło
źródło
Odpowiedzi:
Zadałem tutaj podobne pytanie:
Jak przesłać plik z metadanymi przy użyciu usługi sieci Web REST?
Zasadniczo masz trzy możliwości:
multipart/form-data
POST i zwróć identyfikator klientowi. Następnie klient wysyła metadane z identyfikatorem, a serwer ponownie kojarzy plik i metadane.źródło
Możesz wysłać plik i dane w jednym żądaniu, używając typu zawartości wieloczęściowej / formularza :
From http://www.faqs.org/rfcs/rfc2388.html :
Możesz zawrzeć informacje o pliku lub informacje o polu w każdej sekcji między granicami. Z powodzeniem wdrożyłem usługę RESTful, która wymagała od użytkownika przesłania zarówno danych, jak i formularza, a dane wieloczęściowe / dane działały idealnie. Usługa została zbudowana przy użyciu Java / Spring, a klient korzystał z C #, więc niestety nie mam żadnych przykładów Grails, które mogłyby dać ci informacje na temat konfiguracji usługi. W tym przypadku nie musisz używać JSON, ponieważ każda sekcja „dane formularza” zapewnia miejsce do określenia nazwy parametru i jego wartości.
Dobrą rzeczą w korzystaniu z danych wieloczęściowych / formularzy jest to, że używasz nagłówków zdefiniowanych w HTTP, więc trzymasz się filozofii REST polegającej na używaniu istniejących narzędzi HTTP do tworzenia usługi.
źródło
Wiem, że ten wątek jest dość stary, brakuje mi jednak jednej opcji. Jeśli masz metadane (w dowolnym formacie), które chcesz wysłać wraz z danymi do przesłania, możesz złożyć pojedyncze
multipart/related
żądanie.Możesz sprawdzić specyfikację RFC 2387, aby uzyskać bardziej szczegółowe informacje.
Zasadniczo każda część takiego żądania może zawierać treść różnego typu, a wszystkie części są w jakiś sposób powiązane (np. Obraz i jego metadane). Części są identyfikowane za pomocą ciągu granicznego, a po ostatnim ciągu granicznym występują dwa myślniki.
Przykład:
źródło
Wiem, że to pytanie jest stare, ale w ostatnich dniach szukałem w całej sieci rozwiązania tego samego pytania. Mam serwisy internetowe REST grails i klienta iPhone, które wysyłają zdjęcia, tytuł i opis.
Nie wiem, czy moje podejście jest najlepsze, ale jest takie łatwe i proste.
Robię zdjęcie za pomocą UIImagePickerController i przesyłam do serwera NSData za pomocą tagów nagłówka żądania wysłania danych obrazu.
Po stronie serwera otrzymuję zdjęcie za pomocą kodu:
Nie wiem, czy mam problemy w przyszłości, ale teraz działa dobrze w środowisku produkcyjnym.
źródło
Oto moje podejście API (korzystam z przykładu) - jak widać, nie używam żadnego
file_id
(przesłanego identyfikatora pliku na serwer) w API:Utwórz
photo
obiekt na serwerze:Prześlij plik (uwaga, że
file
jest w formie pojedynczej, ponieważ jest tylko jeden na zdjęcie):A potem na przykład:
Przeczytaj listę zdjęć
Przeczytaj szczegóły zdjęcia
Przeczytaj plik ze zdjęciem
Wniosek jest taki, że najpierw tworzysz obiekt (zdjęcie) za pomocą POST, a następnie wysyłasz drugie żądanie z plikiem (ponownie POST).
źródło
Obiekty FormData: przesyłanie plików za pomocą Ajax
XMLHttpRequest poziom 2 dodaje obsługę nowego interfejsu FormData. Obiekty FormData umożliwiają łatwe tworzenie zestawu par klucz / wartość reprezentujących pola formularza i ich wartości, które można następnie łatwo przesłać za pomocą metody send () XMLHttpRequest.
https://developer.mozilla.org/en-US/docs/Web/API/FormData
źródło
Ponieważ jedynym brakującym przykładem jest ANDROID , dodam go. W tej technice użyto niestandardowego zadania AsyncTask, które powinno być zadeklarowane w klasie aktywności.
Jeśli chcesz przesłać plik, zadzwoń:
źródło
Chciałem wysłać kilka ciągów do serwera zaplecza. Nie używałem jsona z wieloma częściami, użyłem parametrów żądania.
Url wyglądałby
Mijam dwa parametry (identyfikator UUID i typ) wraz z przesyłaniem pliku. Mam nadzieję, że pomoże to tym, którzy nie mają skomplikowanych danych Json do wysłania.
źródło
Możesz spróbować użyć biblioteki https://square.github.io/okhttp/ . Możesz ustawić treść żądania na wieloczęściową, a następnie osobno dodać plik i obiekty json:
źródło
źródło
Upewnij się, że masz następujący import. Oczywiście inne standardowe przywozy
źródło
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String