Ich habe gerade mit der Entwicklung von REST-Diensten begonnen, bin jedoch auf eine schwierige Situation gestoßen: Senden von Dateien von meinem REST-Dienst an meinen Client. Bisher habe ich verstanden, wie man einfache Datentypen (Zeichenfolgen, Ganzzahlen usw.) sendet, aber das Senden einer Datei ist eine andere Sache, da es so viele Dateiformate gibt, dass ich nicht weiß, wo ich überhaupt anfangen soll. Mein REST-Service wird auf Java erstellt und ich verwende Jersey. Ich sende alle Daten im JSON-Format.
Ich habe über Base64-Codierung gelesen. Einige Leute sagen, dass dies eine gute Technik ist, andere sagen, dass dies nicht auf Probleme mit der Dateigröße zurückzuführen ist. Was ist der richtige Weg? So sieht eine einfache Ressourcenklasse in meinem Projekt aus:
import java.sql.SQLException;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import com.mx.ipn.escom.testerRest.dao.TemaDao;
import com.mx.ipn.escom.testerRest.modelo.Tema;
@Path("/temas")
public class TemaResource {
@GET
@Produces({MediaType.APPLICATION_JSON})
public List<Tema> getTemas() throws SQLException{
TemaDao temaDao = new TemaDao();
List<Tema> temas=temaDao.getTemas();
temaDao.terminarSesion();
return temas;
}
}
Ich vermute, der Code zum Senden einer Datei wäre ungefähr so:
import java.sql.SQLException;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("/resourceFiles")
public class FileResource {
@GET
@Produces({application/x-octet-stream})
public File getFiles() throws SQLException{ //I'm not really sure what kind of data type I should return
// Code for encoding the file or just send it in a data stream, I really don't know what should be done here
return file;
}
}
Welche Art von Anmerkungen sollte ich verwenden? Ich habe einige Leute gesehen, die eine @GET
Verwendung empfohlen haben. Ist @Produces({application/x-octet-stream})
das der richtige Weg? Die Dateien, die ich sende, sind spezifisch, sodass der Client die Dateien nicht durchsuchen muss. Kann mich jemand anleiten, wie ich die Datei senden soll? Sollte ich es mit base64 codieren, um es als JSON-Objekt zu senden? oder ist die Codierung nicht erforderlich, um es als JSON-Objekt zu senden? Vielen Dank für jede Hilfe, die Sie geben können.
java.io.File
(oder Dateipfad) auf Ihrem Server oder stammen die Daten aus einer anderen Quelle, z. B. einer Datenbank, einem Webdienst oder einem Methodenaufruf, der einen zurückgibtInputStream
?Antworten:
Ich empfehle nicht, Binärdaten in base64 zu codieren und in JSON zu verpacken. Es wird nur unnötig die Größe der Antwort erhöhen und die Dinge verlangsamen.
Stellen Sie Ihre Dateidaten einfach mit GET und
application/octect-stream
einer der werkseitigen Methoden vonjavax.ws.rs.core.Response
(Teil der JAX-RS-API, damit Sie nicht an Jersey gebunden sind) bereit:Wenn Sie kein tatsächliches
File
Objekt haben, aber einInputStream
,Response.ok(entity, mediaType)
sollte dies ebenfalls möglich sein.quelle
ZipOutputStream
zusammen mit der Rückgabe einesStreamingOutput
vongetFile()
. Auf diese Weise erhalten Sie ein bekanntes Multi-File-Format, das die meisten Clients leicht lesen können sollten. Verwenden Sie die Komprimierung nur, wenn dies für Ihre Daten sinnvoll ist, dh nicht für vorkomprimierte Dateien wie JPEGs. Auf der Client-Seite mussZipInputStream
die Antwort analysiert werden.Wenn Sie eine herunterzuladende Datei zurückgeben möchten, insbesondere wenn Sie einige Javascript-Bibliotheken zum Hochladen / Herunterladen von Dateien integrieren möchten, sollte der folgende Code die folgende Aufgabe ausführen:
quelle
Ändern Sie die Computeradresse von localhost in IP-Adresse, mit der Ihr Client eine Verbindung herstellen soll, um den unten genannten Dienst aufzurufen.
Client zum Aufrufen des REST-Webservices:
Service für Antwortclient:
JAR benötigt:
WEB.XML:
quelle
Da Sie JSON verwenden, würde ich Base64 Encode verwenden, bevor Sie es über das Kabel senden.
Wenn die Dateien groß sind, versuchen Sie, BSON oder ein anderes Format zu betrachten, das bei binären Übertragungen besser ist.
Sie können die Dateien auch komprimieren, wenn sie gut komprimiert sind, bevor Sie sie von base64 codieren.
quelle
@Produces
Anmerkung enthalten?