我有一个基于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,因此服务器仍在执行正确的行为。在测试中我需要做什么才能看到我想看到的内容?
答案 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
我不知道您在服务器资源中使用了什么。随时告诉我。
希望它可以帮到你, 亨利