【发布时间】:2017-01-11 10:36:59
【问题描述】:
我有一个向我的 Rest API 发出请求的 Servlet,我希望它通过 HttpServletResponse 将 API 响应内容返回给最终用户。
内容实际上是一个要下载的 .xls 文件,我将其放入带有 StreamingOutput 对象的响应中。
我该怎么做?我无法将响应转换为 HttpServletResponse
Rest API 方法:
@GET
@Produces( MediaType.APPLICATION_JSON )
@Path("bla")
public Response getTopicByName() {
final Workbook wb = new HSSFWorkbook();
StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
wb.write(output);
}
};
responseBuilder = responseBuilder.entity(stream);
responseBuilder = responseBuilder.status(Response.Status.OK);
responseBuilder = responseBuilder.header("Content-Disposition", "attachment; filename=" + device + ".xls");
return responseBuilder.build();
}
Servlet POST 方法:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url);
Response res = target. request().get();
if (res.getStatus() == 200) {
// how to put res stream into response stream ?
ServletOutputStream stream = response.getOutputStream();
}
client.close();
}
编辑:
我尝试了 TedTrippin 方法,在找到从 Response 中恢复 InputStream 的方法后,效果很好。
但我不断收到损坏的 xls 文件。这很烦人。当我直接从浏览器发出请求时,我没有得到那些损坏的文件。 有任何线索吗?
POST 方法:
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Client client = ClientBuilder.newClient();
WebTarget target = client.target(url + param + format);
Response res = target.request().get();
if (res.getStatus() == 200) {
response.setHeader("Content-Disposition", "attachment; filename=test.xls");
InputStream in = res.readEntity(InputStream.class);
ServletOutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
while (in.read(buffer) >= 0) {
out.write(buffer);
}
out.flush();
}
client.close();
}
【问题讨论】:
标签: java rest servlets jakarta-ee