gpt4 book ai didi

java - 如何将 JAX-RS 响应重用到 HttpServletResponse 中?

转载 作者:行者123 更新时间:2023-12-01 09:02:02 27 4
gpt4 key购买 nike

我有一个 Servlet,它向我的 Rest API 发出请求,我希望它通过 HttpServletResponse 将 API 响应内容返回给最终用户。

内容实际上是一个要下载的 .xls 文件,我将其放入带有 StreamingOutput 对象的响应中。

我怎样才能做到这一点?我无法将 Response 转换为 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();
}

最佳答案

最简单的方法是读取响应流并将其直接写入响应输出流。使用 IOUtils 或 Guava 的库函数或纯 java...

try (InputStream in = ...;
OutputStream out = ...) {
byte[] buffer = new byte[1024];
while (in.read(buffer) >= 0)
out.write(buffer);
} catch (IOException ex) {
...
}

更好的(取决于您的观点)方法是将响应读取/保存为临时文件,然后您可以返回该响应或将其写入输出流。

第三种方法是创建一个管道,但我认为这不适用于此处。

关于java - 如何将 JAX-RS 响应重用到 HttpServletResponse 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41588537/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com