Saya baru saja mulai mengembangkan layanan REST, tetapi saya menemukan situasi yang sulit: mengirim file dari layanan REST saya ke klien saya. Sejauh ini saya sudah memahami cara mengirim tipe data sederhana (string, integer, dll) tetapi mengirim file adalah masalah yang berbeda karena ada begitu banyak format file yang saya tidak tahu di mana saya harus memulai. Layanan REST saya dibuat di Java dan saya menggunakan Jersey, saya mengirim semua data menggunakan format JSON.
Saya telah membaca tentang pengkodean base64, beberapa orang mengatakan itu teknik yang bagus, yang lain mengatakan itu bukan karena masalah ukuran file. Bagaimana cara yang benar? Beginilah tampilan kelas sumber daya sederhana dalam proyek saya:
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;
}
}
Saya menduga kode untuk mengirim file akan menjadi seperti:
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;
}
}
Jenis anotasi apa yang harus saya gunakan? Saya telah melihat beberapa orang merekomendasikan untuk @GET
digunakan @Produces({application/x-octet-stream})
, apakah itu cara yang benar? File yang saya kirim adalah file khusus sehingga klien tidak perlu menelusuri file. Adakah yang bisa memandu saya tentang bagaimana saya bisa mengirim file? Haruskah saya menyandikannya menggunakan base64 untuk mengirimkannya sebagai objek JSON? atau encoding tidak diperlukan untuk mengirimkannya sebagai objek JSON? Terima kasih atas bantuan yang mungkin Anda berikan.
java.io.File
(atau jalur file) di server Anda atau apakah datanya berasal dari beberapa sumber lain, seperti database, layanan web, panggilan metode yang mengembalikanInputStream
?Jawaban:
Saya tidak merekomendasikan pengkodean data biner di base64 dan membungkusnya dalam JSON. Itu hanya akan meningkatkan ukuran respons dan memperlambat segalanya.
Cukup sajikan data file Anda menggunakan GET dan
application/octect-stream
menggunakan salah satu metode pabrikjavax.ws.rs.core.Response
(bagian dari JAX-RS API, sehingga Anda tidak terkunci di Jersey):Jika Anda tidak memiliki
File
objek sebenarnya , tetapi sebuahInputStream
,Response.ok(entity, mediaType)
harus bisa mengatasinya juga.sumber
ZipOutputStream
bersama dengan mengembalikanStreamingOutput
darigetFile()
. Dengan cara ini Anda mendapatkan format multi-file terkenal yang dapat dibaca dengan mudah oleh sebagian besar klien. Gunakan kompresi hanya jika masuk akal untuk data Anda, yaitu bukan untuk file pra-kompresi seperti JPEG. Di sisi klien, adaZipInputStream
untuk mengurai respons.Jika Anda ingin mengembalikan File yang akan diunduh, khususnya jika Anda ingin mengintegrasikan dengan beberapa libs javascript dari unggah / unduh file, maka kode di bawah ini harus berfungsi:
sumber
Ubah alamat mesin dari localhost ke alamat IP yang Anda ingin klien Anda sambungkan untuk memanggil layanan yang disebutkan di bawah ini.
Klien untuk memanggil layanan web REST:
Layanan untuk menanggapi klien:
JAR dibutuhkan:
WEB.XML:
sumber
Karena Anda menggunakan JSON, saya akan Menyandikan Base64 sebelum mengirimkannya melalui kabel.
Jika filenya besar, coba lihat BSON, atau format lain yang lebih baik dengan transfer biner.
Anda juga dapat membuat file zip, jika dikompresi dengan baik, sebelum base64 mengenkodenya.
sumber
@Produces
dimuat dalam anotasi saya ?