http - EntityTag - 值(value),缓存,比较 - 如何在 Jersey

标签 http rest jersey

目前我正在尝试为我的 jersey restful 服务启用缓存。

所以出现了一些问题。

  1. entityTag 的值是多少?它可以只是一个唯一生成的随机字符串吗?

  2. 当我从客户端向服务器发出发布请求时,我会返回带有实体标记的响应。问题:如何缓存这个以及我如何知道我必须为下一个 get 请求发送哪个缓存的 entityTag?

  3. 在服务器端,我收到发送的 entityTag。我如何将其与资源进行比较?因为我没有将 entityTag 附加到资源。

  4. 它只是比较实体标签。那么我什么时候需要最后修改的 header 值?

抱歉,最好能得到一个服务器端和客户端的例子。我找不到这个问题的任何东西。如何在请求中发送实体标签,如何在服务器端比较它们以及最后修改的内容。

最佳答案

ETags 为客户端缓存提供了一种机制来验证它的缓存内容是否仍然是最新的。关于您的问题:

  1. 由服务器决定 - 它必须在给定时间点唯一标识资源的版本(可以是资源的修订号,或资源表示的 CRC32 哈希,或任何其他可以是用于确定资源是否已更改)
  2. Jersey 目前不提供对客户端缓存的任何支持。您可以通过实现拦截客户端请求的 ClientFilter 创建自己的缓存,查看它的内部 HashMap(例如)将 URI、媒体类型和请求方法映射到缓存的响应。从缓存的响应中获取 ETag 并将其附加到客户端请求。服务器响应时,过滤器检查服务器是否响应304(Not Modified)状态码,如果是,过滤器将之前缓存的响应返回给客户端,如果不是,它缓存从服务器返回的响应并返回给客户端客户。
  3. 通过在请求中发送实体标签,客户端基本上说:“我有一个与该实体标签相对应的实体版本 - 实体是否仍然相同,或者是否发生了变化?如果发生变化,请将实体的新版本以及标签!”。如果服务器在初始响应中未发送任何实体标签,则客户端不知道与缓存实体对应的标签,因此它无法在其请求中发送标签。服务器知道标记的含义 - 对于客户端,标记值是不透明的。
  4. 您可以选择其中之一,也可以同时选择两者。

在服务器端,Jersey 支持评估 ETag 和生成响应。例如。您的资源方法可能如下所示:

@GET
public Response doGet() {
    EntityTag et = yourMethodForCalculatingEntityTagForThisResource();

    // the following method call will result in Jersey checking the headers of the
    // incoming request, comparing them with the entity tag generated for
    // the current version of the resource generates "304 Not Modified" response
    // if the same. Otherwise returns null.
    ResponseBuilder rb = request.evaluatePreconditions(new EntityTag("1"));
    if (rb != null) {
        // Jersey generated 304 response - return it
        return rb.build();
    }
    // return the current version of the resource with the corresponding tag
    return Response.ok(getCurrentVersion(), "text/plain").tag(et).build();
}

对 last-modified header 以及 etag 和 last-modified 提供了相同类型的支持。

这篇维基百科文章很好地概述了 ETag:http://en.wikipedia.org/wiki/HTTP_ETag

关于http - EntityTag - 值(value),缓存,比较 - 如何在 Jersey ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11138215/

相关文章:

http - 为什么 curl 不起作用,但 wget 起作用?

http - CURL 命令行 URL 参数

.net - HTTP 400 : detected invalid characters in the URL. IIS 解码 URL 过早?这里发生了什么?

javascript - WordPress block : async REST calls in registerBlockType edit function

java - 使用 Spring boot 配置 Jersey

java - 如何在 Jersey REST Web 服务中返回数组?

multithreading - 错误 324 (net::ERR_EMPTY_RESPONSE):服务器没有发送任何数据就关闭了连接

java - 无法使用 JAX-RS 上传文件

java - 用于测试 REST Web 应用程序的 JBehave

Java Restful Service eclipse tomcat HTTP错误404