我刚刚开始开发REST服务,但我遇到了一个困难的情况:从我的REST服务发送文件到我的客户端 . 到目前为止,我已经掌握了如何发送简单数据类型(字符串,整数等),但发送文件是另一回事,因为有太多的文件格式,我不知道我应该在哪里开始 . 我的REST服务是基于Java的,我使用的是Jersey,我使用JSON格式发送所有数据 .
我读过有关base64编码的内容,有人说这是一种很好的技术,有人说这不是因为文件大小问题 . 什么是正确的方法?这就是我项目中一个简单的资源类看起来的样子:
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;
}
}
我猜测发送文件的代码是这样的:
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;
}
}
我应该使用什么样的注释?我见过有人推荐 @GET
使用 @Produces({application/x-octet-stream})
,这是正确的方法吗?我需要浏览文件的文件 . 任何人都可以指导我如何发送文件?我应该使用base64对其进行编码以将其作为JSON对象发送吗?或者不需要编码将其作为JSON对象发送?感谢您提供的任何帮助 .
4 回答
我不建议在base64中编码二进制数据并将其包装在JSON中 . 它只会不必要地增加响应的大小并减慢速度 .
只需使用GET和
application/octect-stream
使用javax.ws.rs.core.Response(JAX-RS API的一部分,因此您没有锁定到Jersey)的工厂方法之一来提供文件数据:如果你没有实际的
File
对象,但InputStream
,Response.ok(entity, mediaType)也应该能够处理它 .如果你想返回一个要下载的文件,特别是如果你想要与文件上传/下载的一些javascript库集成,那么下面的代码应该做的工作:
将机器地址从localhost更改为您希望客户端连接的IP地址,以便调用下面提到的服务 .
客户端调用REST Web服务:
服务响应客户:
JAR需要:
WEB.XML:
由于您使用的是JSON,我会在通过网络发送之前对Base64进行编码 .
如果文件很大,请尝试查看BSON,或其他一些二进制传输更好的格式 .
如果文件压缩得很好,你也可以压缩文件,然后再对base64进行编码 .