Restlet 客户端资源"not modified" 条件

Restlet client resource "not modified" condition

我有一个基于 Restlet 的应用程序,我正在尝试使用 Restlet 客户端资源来测试它的某些部分。

自从从 Restlet 2.2.3 升级到 2.3.4 后,我的 ETag 验证测试开始失败。这是我在旧版本中添加 header 的方式:

Series<Header> headers = (Series<Header>) currentClientResource.getRequest().getAttributes().get("org.restlet.http.headers");
if (headers == null) {
    headers = new Series<Header>(Header.class);
}
headers.add("If-None-Match", "\"" + eTag + "\"");
currentClientResource.getRequestAttributes().put("org.restlet.http.headers", headers);

然后在包装的 clientResource 上再次调用 represent() 时,我得到了 304 Not Modified 响应(这正是我想要的)。

在 2.3.4 中,这开始返回 200 OK,我注意到一条关于未直接设置 If-None-Match header 的日志消息。 相反,我现在正在尝试这样做:

currentClientResource.getRequest().getConditions().getNoneMatch().add(new Tag(eTag));

然而,这仍然给我一个 200 OK。如果我通过 REST 客户端手动执行请求,我可以获得 304 Not Modified,因此服务器仍在执行正确的行为。我需要在测试中做什么才能看到我想看到的?

我试了一下,它适用于我的 Restlet 2.3.4 版。

这是我所做的:

  • Maven 依赖项 用于我的测试

    <project>
      <modelVersion>4.0.0</modelVersion>
      (...)
    
      <properties>
        <java-version>1.7</java-version>
        <restlet-version>2.3.4</restlet-version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.restlet.jse</groupId>
          <artifactId>org.restlet</artifactId>
          <version>${restlet-version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.restlet.jse</groupId>
          <artifactId>org.restlet.ext.jetty</artifactId>
          <version>${restlet-version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.restlet.jse</groupId>
          <artifactId>org.restlet.ext.jackson</artifactId>
          <version>${restlet-version}</version>
        </dependency>
    
        <dependency>
          <groupId>org.restlet.jse</groupId>
          <artifactId>org.restlet.ext.crypto</artifactId>
          <version>${restlet-version}</version>
        </dependency>
      </dependencies>
    
      <repositories>
        <repository>
          <id>maven-restlet</id>
          <name>Public online Restlet repository</name>
          <url>http://maven.restlet.com</url>
        </repository>
      </repositories>
    </project>
    
  • 服务器资源,在 returned 表示上设置 etag:

    public class ETagServerResource extends ServerResource {
      @Get
      public Representation test() {
        String test = "test";
        String md5 = DigestUtils.toMd5(test);
    
        StringRepresentation repr = new StringRepresentation(test);
        repr.setTag(new Tag(md5));
        return repr;
      }
    }
    
  • 进行两次调用的客户端:第一个没有 etag,第二个有 etag,应该 return 304 状态代码。

    // First call
    ClientResource cr
         = new ClientResource("http://localhost:8182/test");
    Representation repr = cr.get();
    Tag tag = repr.getTag();
    System.out.println(">> cr = "+cr); // Status code: 200
    
    // Second call
    cr.getRequest().getConditions().getNoneMatch().add(tag);
    cr.get();
    System.out.println(">> cr = "+cr); // Status code: 304
    

我不知道你在服务器资源中使用什么。欢迎告诉我。

希望对你有帮助, 蒂埃里