如何使用Jersey启用可恢复的GET请求?

时间:2011-08-03 22:20:56

标签: java rest jersey

我正在使用Jersey创建RESTful Web服务。一些资源是二进制文件,我可以根据需要从其他地方获取;这样的文件可能很大(几百MB)。

我希望浏览器获取这些资源,因此我有一个@ GET注释的方法返回StreamingOutput,就像在this answer中一样。

我有两个问题:

  • StreamingOutput是否正确返回文件?
  • 我应该在服务器端做些什么才能使浏览器恢复中断的文件传输?

2 个答案:

答案 0 :(得分:1)

只需使用与范围相关的HTTP标头,请注意w.r.t.缓存。首先,通过设置Accept-Ranges标题来宣传您可以恢复。其次,检查Range和If-Range标头,并发送相应的响应。

请注意,您可能需要构建自己的Response并手动设置所需的标头和结果代码。

答案 1 :(得分:0)

出于同样的目的,我构建了一个window.location.hostname.match(/[^\.]+\.[^\.]+$/) 来拦截带有ContainerResponseFilter标头的请求,并相应地修改了响应[1]。

这是Range,它将使用ContainerResponseFilter封装输出流(见下文):

RangedOutputStream

这里是public class RangeResponseFilter implements ContainerResponseFilter { private static final String RANGE = "Range"; private static final String ACCEPT_RANGES = "Accept-Ranges"; @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { if (requestContext.getHeaders().containsKey(RANGE)) { String rangeHeader = requestContext.getHeaderString(RANGE); String contentType = responseContext.getMediaType().toString(); OutputStream originOutputStream = responseContext.getEntityStream(); RangedOutputStream rangedOutputStream = new RangedOutputStream(originOutputStream, rangeHeader, contentType, responseContext.getHeaders()); responseContext.setStatus(Status.PARTIAL_CONTENT.getStatusCode()); responseContext.getHeaders().putSingle(ACCEPT_RANGES, rangedOutputStream.getAcceptRanges()); responseContext.setEntityStream(rangedOutputStream); } } }

RangedOutputStream

[1] https://github.com/heruan/jersey-range-filter