Używam Jersey do zaimplementowania interfejsu API RESTful, który jest głównie pobierany i obsługujący dane zakodowane w formacie JSON. Ale są sytuacje, w których muszę wykonać następujące czynności:
- Eksportuj dokumenty do pobrania, takie jak PDF, XLS, ZIP lub inne pliki binarne.
- Pobierz dane wieloczęściowe, takie jak niektóre JSON oraz przesłany plik XLS
Mam jednostronicowego klienta sieci Web opartego na JQuery, który tworzy wywołania AJAX do tej usługi sieci Web. W tej chwili nie przesyła formularzy i używa GET i POST (z obiektem JSON). Czy powinienem użyć postu formularza do wysłania danych i załączonego pliku binarnego, czy mogę utworzyć żądanie wieloczęściowe z plikiem JSON plus binarnym?
Warstwa usług mojej aplikacji obecnie tworzy ByteArrayOutputStream podczas generowania pliku PDF. Jaki jest najlepszy sposób przesłania tego strumienia do klienta za pośrednictwem Jersey? Utworzyłem MessageBodyWriter, ale nie wiem, jak go używać z zasobu Jersey. Czy to właściwe podejście?
Przeglądałem próbki dołączone do Jersey, ale nie znalazłem jeszcze niczego, co ilustruje, jak zrobić jedną z tych rzeczy. Jeśli to ma znaczenie, używam Jersey z Jacksonem do wykonywania Object-> JSON bez kroku XML i tak naprawdę nie używam JAX-RS.
Response
obiektu. W ten sposób możesz łatwo kontrolować typ nośnika, kod odpowiedzi HTTP itp. Daj mi znać, jeśli chcesz, abym wysłał kod.Musiałem zwrócić plik rtf i to zadziałało.
źródło
Używam tego kodu do eksportu pliku Excela (xlsx) (Apache Poi) w koszulce jako załącznika.
źródło
Oto kolejny przykład. Tworzę QRCode jako PNG za pomocą pliku
ByteArrayOutputStream
. Zasób zwraca plikResponse
obiekt, a dane strumienia są jednostką.Aby zilustrować obsługę kodu odpowiedzi, Dodałem obsługi nagłówków Cache (
If-modified-since
,If-none-matches
itp).Proszę, nie bij mnie na wypadek, gdyby
stream.toByteArray()
nie było mądrej pamięci :) To działa dla moich plików PNG <1KB ...źródło
Moje usługi Jersey 1.17 komponowałem w następujący sposób:
FileStreamingOutput
GET
A klient, jeśli tego potrzebujesz:
Client
źródło
Ten przykład pokazuje, jak publikować pliki dziennika w JBoss za pośrednictwem zasobu resztkowego. Zwróć uwagę, że metoda get używa interfejsu StreamingOutput do przesyłania strumieniowego zawartości pliku dziennika.
}
źródło
Korzystanie z Jersey 2.16 Pobieranie pliku jest bardzo łatwe.
Poniżej znajduje się przykład pliku ZIP
źródło
Poniższe informacje były dla mnie pomocne i chciałem się nimi podzielić na wypadek, gdyby pomogły Tobie lub komuś innemu. Chciałem czegoś takiego jak MediaType.PDF_TYPE, który nie istnieje, ale ten kod robi to samo:
Zobacz http://jersey.java.net/nonav/apidocs/1.1.0-ea/contribs/jersey-multipart/com/sun/jersey/multipart/file/DefaultMediaTypePredictor.CommonMediaTypes.html
W moim przypadku wysyłałem dokument PDF do innej witryny:
Następnie p zostanie przekazany jako drugi parametr funkcji post ().
Ten link był dla mnie pomocny w tworzeniu tego fragmentu kodu: http://jersey.576304.n2.nabble.com/Multipart-Post-td4252846.html
źródło
To działało dobrze ze mną adres URL: http://example.com/rest/muqsith/get-file?filePath=C : \ Users \ I066807 \ Desktop \ test.xml
źródło
Response.ok("file path null").build();
, czy to naprawdę w porządku? Prawdopodobnie powinieneś użyć czegoś takiego jakResponse.status(Status.BAD_REQUEST).entity(...
Inny przykładowy kod, w którym można przesłać plik do usługi REST, usługa REST spakuje plik, a klient pobiera plik zip z serwera. To jest dobry przykład wykorzystania binarnych strumieni wejściowych i wyjściowych przy użyciu Jersey.
https://stackoverflow.com/a/32253028/15789
Ta odpowiedź została opublikowana przeze mnie w innym wątku. Mam nadzieję że to pomoże.
źródło