我正在使用 Jersey 创建 RESTful API 资源,并使用 ResponseBuilder
生成响应。
RESTful 资源的示例代码:
public class infoResource{
@GET
@Path("service/{id}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response getCompany(@PathParam("id")String id) {
//company is just a POJO.
Company company = getCompany(id);
return Response.status(200).entity(company).build();
}
}
在响应中,它在响应 header 中返回分块传输编码。在“ Jersey 世界”中,让它返回 Content-Length
header 而不是响应 header 中的 Transfer-Encoding: chunked
header 的正确方法是什么?
最佳答案
选择 Content-Length
或 Transfer-Encoding
只是容器的选择。这实际上是缓冲区大小的问题。
一个可能的解决方案是提供一个 SevletFilter
,它缓冲所有这些编码字节并设置 Content-Length
header 值。
参见 this page .
@WebFilter
public class BufferFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
final ByteArrayOutputStream buffer =
new ByteArrayOutputStream();
// prepare a new ServletResponseWrapper
// which returns the buffer as its getOutputStream();
chain.doFilter(...)
// now you know how exactly big is your response.
final byte[] responseBytes = buffer.toByteArray();
response.setContentLength(responseBytes.length);
response.getOutputStream().write(responseBytes);
response.flush();
}
@Override
public void destroy() {
}
}
关于java - Jersey /JAX-RS : Return Content-Length in response header instead of chunked transfer encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11659330/