说明:以下部分文字说明摘自<<Restful Web Service>>.
条件GET机制令客户端可以在表示没有发生变化时,只使用很少的带宽。而缓存机
制使得客户端可以根本不必要发送第二次GET请求。
其基本原理是:
客户端在做HTTP GET或HEAD请求时,可以把服务器返回的HTTP响应报头缓存起来;这样,当客户端再次发
出相同的GET或HEAD请求时,可以直接采用缓存中的文档,而不必实际发出请求。缓存机制是透明的,用
户要客户端发出请求,但是客户端并没有实际发出HTTP请求,并接收来自服务器的响应,而是把缓存中的
响应返回给用户,仿佛刚从服务器得到的一样。可以从服务器角度关注三个问题:服务器如何通知客户端
可以缓存;服务器如何通知客户端不要缓存;何时客户端可以在服务器不知情的情况下进行缓存。
了解了原理后,我们来看看如何使用Restlet实现缓存:
1. 服务器端通知客户端可以缓存
客户端第一次请求一个资源时,这个时候没有缓存,因为这个需要等待服务器通知后,客户端才可以缓存。服务器端我们设置两个Header: Expires和cache-control.代码如下:
@Override
public Representation represent(Variant variant) {
String userMsg = customerDAO.getCustomerById(customerId);
Representation representation = new StringRepresentation(userMsg, MediaType.TEXT_PLAIN);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date expirationDate = null;
try {
expirationDate = format.parse("2009-07-29 00:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
representation.setExpirationDate(expirationDate);
Form resHeaders = (Form)getResponse().getAttributes().get("org.restlet.http.headers");
if (resHeaders == null) {
resHeaders = new Form();
}
resHeaders.add("Cache-Control", "max-age=3600");
getResponse().getAttributes().put("org.restlet.http.headers", resHeaders);
return representation;
}
在这段代码里,我们设置了Expires和Cache-Control,但是你会发现两种header的设置方式不一样,对于Expires,Restlet直接提供了设置方法,而对于Cache-Control,我们不得不通过设置Attribute的方式来实现。这是因为当前版本,也就是1.1的版本,restlet还没有提供这样的方法,在restlet2.0M5,甚至正式版将会在Representation里直接提供这些设置标准Header的方法。
感兴趣的话,可以查看HttpConverter类来查看Restlet1.1的版本已经为哪些Header提供了直接的方法支持,而哪些在以后新的版本中提供。
另外一个需要说明的一点是,Cache-Control的值,我们设置了max-age=3600,注意,如果设置这个值,那么它会覆盖Expires。
万事具备,让我们测试一下,打开浏览器输入URL(我本机环境是:http://localhost:8080/restlet/resources/customers/1),并且为了方便查看结果,你可以在上面的方法上加入断点,当第一次请求的时候,服务器端会收到请求,当后面再继续用同样的URL做请求时,你会发现服务器端代码没有执行,实际上就是浏览器已经把返回的header和表示做了缓存。当第二次以及以后再次请求,都是从缓存中取回表示(Representation)。
让我们采用Httpclient来重新测试一下,
HttpClient client = new HttpClient();
HttpMethod get = new GetMethod("http://localhost:8080/restlet/resources/customers/1");
boolean isCached = false;
boolean hasMaxAge = false;
String expirationDate = null;
client.executeMethod(get);
Header[] headers = get.getResponseHeaders();
for(int i = 0; i < headers.length; i++){
Header header = headers[i];
if(header.getName().equals("Cache-Control")){
isCached = true;
if(header.getValue().startsWith("max-age")){
hasMaxAge = true;
}
}else if(header.getName().equals("Expires")){
expirationDate = header.getValue();
}
}
if(isCached){
if(hasMaxAge){
//Cache the representation and save max age
}else if(expirationDate != null && !expirationDate.equals("")){
//Cache the representation and save expiration date
}
}
之所以贴出这段代码,主要想说明,如果使用浏览器的话,判断响应是否包含cache的header,并根据这个header来判断是否cache表示,这个过程被浏览器自动的处理了,而如果是人为的客户端程序,这些判断已经缓存的过程需要我们自己来处理。当然了,是放到缓存里,还是文件或者数据库,这要根据你项目的架构来定。
2.服务器通知客户端不要缓存
有了上面的处理,这个就很简单了,指定Cache-Control的值为:no-cache,以禁止客户端进行缓存,也可以把Cache-Control的值设置成private,表示该响应能够被客户端缓存,不能被代理缓存。当然了Cache-Control的值不止我提到的这几个,更多的你可以查看HTTP规范。
分享到:
相关推荐
本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...
4. **过滤器机制**:RESTlet的过滤器可以插入到请求和响应的处理流程中,用于执行预处理或后处理任务,如身份验证、日志记录、缓存控制等。 5. **安全性**:RESTlet提供了安全相关的工具和策略,如HTTPS支持、基本...
REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性的Web服务。在这个"Restlet开发的Basic认证"示例中,我们将探讨如何在Restlet应用中实现HTTP基本认证,这是一种广泛使用的身份...
《深入理解org.restlet-2.3.0.jar:Java RESTful开发的得力助手》 在Java开发领域,REST(Representational State Transfer)架构风格已经成为构建Web服务的主流选择,而org.restlet-2.3.0.jar则是实现RESTful API...
org.restlet.jar
Restlet是一个开源框架,专为构建RESTful(Representational State Transfer)Web服务而设计。REST是一种轻量级的架构风格,常用于构建可扩展、高性能的互联网应用程序。本项目是针对Restlet 2.1版本的学习笔记,...
Restlet是一款开源的Java框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的架构风格,常用于构建高效、可扩展的网络应用程序。本压缩包包含Restlet框架运行所需的全部jar...
### Restlet in Action #### 书籍概述 《Restlet in Action》是一本详细介绍如何使用Java开发RESTful Web API的专业书籍。本书由三位作者共同完成:Jérôme Louvel、Thierry Templier 和 Thierry Boileau,并由...
6. **Clustering and Caching**:对于企业级应用,Restlet支持集群和缓存功能,能够提高服务的可用性和性能。 7. **JAX-RS兼容性**:Restlet 2.x版本开始支持JAX-RS(Java API for RESTful Web Services),这使得...
第二章“Beginning a Restlet application”中,作者通过一个实际的例子引导读者逐步创建一个简单的Restlet应用。这包括设置开发环境、定义资源、处理HTTP方法(如GET、POST等)以及配置服务器。这一章节对于初学者...
### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...
接下来,我们进入"RESTLET开发实例(二)使用Component、Application的REST服务.doc"。在Restlet框架中,Component是整个应用的基础,它负责管理和协调多个Application。Application则是实际处理HTTP请求的实体,它...
这一章涉及了如何优化Restlet应用的性能,包括缓存策略、异步处理、负载均衡等方面。这些高级主题对于构建高效、可靠的Web服务至关重要。 ### 第三部分:进一步使用可能性 #### 9. 在云端部署一个Restlet应用 ...
**Restlet Client插件安装包详解** 在现代的Web应用开发中,API(Application Programming Interface)扮演着至关重要的角色,尤其是RESTful API,它已成为构建分布式系统和微服务架构的标准。为了有效地测试和调试...
#### 二、RESTLET框架的基础架构 - **RESTLET的基本概念**: - **Resources**:表示RESTLET中的资源,是RESTLET应用的核心组件,用于处理特定URL的HTTP请求。 - **Filters**:过滤器用于拦截请求和响应,实现如...
Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...
Restlet项目是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种软件架构风格,它强调简洁、可扩展性和无状态性,是Web服务设计的主流方式。Restlet框架提供了全面的工具集...
通过这个基于Spring的Restlet实例,开发者可以学习到如何在Spring环境下创建和管理REST服务,同时利用Spring的高级特性如事务管理、缓存控制等提升服务的性能和可靠性。这种结合方式为开发高质量、可维护的RESTful ...
Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...