第7章 表现与响应 - 7.4. Conditional GETs and Returning 304 (Not Modified) Responses 条件 GET 和返回304响应

优质
小牛编辑
127浏览
2023-12-01

条件 GET 是一个伟大的方式来减少带宽,并可能提高对服务器端性能,根据信息用于确定条件是如何计算出来的。一个设计良好的网站例如返回 304 (Not Modified) 响应给它提供的静态图像服务。

JAX-RS 使用上下文接口Request来提供对条件 GET 的支持。

下面的例子显示了对条件 GET 的支持:

Example 7.7. Conditional GET support

  1. public SparklinesResource(
  2. @QueryParam("d") IntegerList data,
  3. @DefaultValue("0,100") @QueryParam("limits") Interval limits,
  4. @Context Request request,
  5. @Context UriInfo ui) {
  6. if (data == null) {
  7. throw new WebApplicationException(400);
  8. }
  9. this.data = data;
  10. this.limits = limits;
  11. if (!limits.contains(data)) {
  12. throw new WebApplicationException(400);
  13. }
  14. this.tag = computeEntityTag(ui.getRequestUri());
  15. if (request.getMethod().equals("GET")) {
  16. Response.ResponseBuilder rb = request.evaluatePreconditions(tag);
  17. if (rb != null) {
  18. throw new WebApplicationException(rb.build());
  19. }
  20. }
  21. }

SparklinesResouce 根资源类从请求 URI 计算实体的标签,然后调用带有实体标签的 request.evaluatePreconditions)。如果客户端请求包含一个 If-None-Match 头值包含相同实体标签被计算,那么 evaluatePreconditions 返回一个预先填写 evaluatepreconditions) 响应,带着 304 状态代码和实体标签设置,可以建立和恢复。否则,evaluatepreconditions) 返回 null,正常的响应可以返回。

注意,在这个例子中,一个资源类的构造函数是用来执行,否则可能被复制到每个资源的方法调用动作。资源类的生命周期是每个请求这意味着资源的实例为每个请求创建的,因此可以用请求参数,例如更改请求处理通过抛出异常,就像在这个例子所示。