Restlet客户端资源“未修改”条件

时间:2015-11-09 19:52:14

标签: rest restlet etag

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

从Restlet 2.2.3升级到2.3.4后,我的ETag验证测试开始失败。以下是我在旧版本中添加标题的方法:

String EXAMPLE_TEST = "ddd with fff Node  preceded"
            + " by Class Application  bzxcd by " 
            + "Class aaa ds  preceded by Class bbbb xxxx Ass";


String[] str=EXAMPLE_TEST.split(" ");     

   for (int i = 0; i < str.length-1; i++) {
        if (str[i].equals("Class")){
            ++i;
            System.out.print(str[i]+" ");

        }

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

在2.3.4中,这开始返回200 OK,我注意到有关未直接设置If-None-Match标头的日志消息。 相反,我现在正在尝试这个:

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);

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

1 个答案:

答案 0 :(得分:1)

我试了一下,它适用于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>
    
  • 服务器资源,用于在返回的表示形式上设置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,应返回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
    

我不知道您在服务器资源中使用了什么。随时告诉我。

希望它可以帮到你, 亨利