Ich verwende Jersey, um eine RESTful-API zu implementieren, die hauptsächlich JSON-codierte Daten abruft und bereitstellt. Aber ich habe einige Situationen, in denen ich Folgendes erreichen muss:
- Exportieren Sie herunterladbare Dokumente wie PDF, XLS, ZIP oder andere Binärdateien.
- Rufen Sie mehrteilige Daten ab, z. B. JSON und eine hochgeladene XLS-Datei
Ich habe einen einseitigen JQuery-basierten Webclient, der AJAX-Aufrufe für diesen Webdienst erstellt. Im Moment werden keine Formularübermittlungen durchgeführt und GET und POST (mit einem JSON-Objekt) verwendet. Sollte ich einen Formularbeitrag zum Senden von Daten und einer angehängten Binärdatei verwenden oder kann ich eine mehrteilige Anforderung mit JSON plus Binärdatei erstellen?
Die Service-Schicht meiner Anwendung erstellt derzeit einen ByteArrayOutputStream, wenn eine PDF-Datei generiert wird. Was ist der beste Weg, um diesen Stream über Jersey an den Client auszugeben? Ich habe einen MessageBodyWriter erstellt, weiß aber nicht, wie ich ihn aus einer Jersey-Ressource verwenden soll. Ist das der richtige Ansatz?
Ich habe die in Jersey enthaltenen Beispiele durchgesehen, aber noch nichts gefunden, das veranschaulicht, wie eines dieser beiden Dinge zu tun ist. Wenn es darauf ankommt, verwende ich Jersey mit Jackson, um Object-> JSON ohne den XML-Schritt auszuführen, und verwende JAX-RS nicht wirklich.
Response
Objekt zurückzugeben. Auf diese Weise können Sie den Medientyp, den HTTP-Antwortcode usw. einfach steuern. Lassen Sie mich wissen, ob ich einen Code veröffentlichen soll.Ich musste eine RTF-Datei zurückgeben und das funktionierte für mich.
quelle
Ich verwende diesen Code, um eine Excel-Datei (xlsx) (Apache Poi) in Jersey als Anhang zu exportieren.
quelle
Hier ist ein weiteres Beispiel. Ich erstelle einen QRCode als PNG über a
ByteArrayOutputStream
. Die Ressource gibt einResponse
Objekt zurück und die Daten des Streams sind die Entität.Um die Antwortcode Handhabung veranschaulicht, habe ich den Umgang mit Cache - Header hinzugefügt (
If-modified-since
,If-none-matches
usw.).Bitte verprügel mich nicht, falls
stream.toByteArray()
es ein No-No-Speicher ist :) Es funktioniert für meine <1 KB PNG-Dateien ...quelle
Ich habe meine Jersey 1.17-Dienste folgendermaßen zusammengestellt:
FileStreamingOutput
GET
Und der Kunde, wenn Sie es brauchen:
Client
quelle
Dieses Beispiel zeigt, wie Protokolldateien in JBoss über eine Restressource veröffentlicht werden. Beachten Sie, dass die get-Methode die StreamingOutput-Schnittstelle verwendet, um den Inhalt der Protokolldatei zu streamen.
}}
quelle
Das Herunterladen von Jersey 2.16-Dateien ist sehr einfach.
Unten sehen Sie das Beispiel für die ZIP-Datei
quelle
Ich fand das Folgende hilfreich für mich und wollte es teilen, falls es Ihnen oder jemand anderem hilft. Ich wollte so etwas wie MediaType.PDF_TYPE, das es nicht gibt, aber dieser Code macht dasselbe:
Siehe http://jersey.java.net/nonav/apidocs/1.1.0-ea/contribs/jersey-multipart/com/sun/jersey/multipart/file/DefaultMediaTypePredictor.CommonMediaTypes.html
In meinem Fall habe ich ein PDF-Dokument auf einer anderen Site veröffentlicht:
Dann wird p als zweiter Parameter an post () übergeben.
Dieser Link war hilfreich für mich beim Zusammenstellen dieses Code-Snippets: http://jersey.576304.n2.nabble.com/Multipart-Post-td4252846.html
quelle
Dies funktionierte gut mit meiner URL: http://example.com/rest/muqsith/get-file?filePath=C : \ Users \ I066807 \ Desktop \ test.xml
quelle
Response.ok("file path null").build();
, ist es wirklich in Ordnung? Sie sollten wahrscheinlich so etwas wieResponse.status(Status.BAD_REQUEST).entity(...
Ein weiterer Beispielcode, mit dem Sie eine Datei in den REST-Dienst hochladen können. Der REST-Dienst komprimiert die Datei und der Client lädt die Zip-Datei vom Server herunter. Dies ist ein gutes Beispiel für die Verwendung von binären Eingabe- und Ausgabestreams mit Jersey.
https://stackoverflow.com/a/32253028/15789
Diese Antwort wurde von mir in einem anderen Thread gepostet. Hoffe das hilft.
quelle