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
我不知道你在服务器资源中使用什么。欢迎告诉我。
希望对你有帮助,
蒂埃里
我有一个基于 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
我不知道你在服务器资源中使用什么。欢迎告诉我。
希望对你有帮助, 蒂埃里