`
ajax
  • 浏览: 253659 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Restlet实战(二十五)缓存 (Cache)

    博客分类:
  • REST
阅读更多

说明:以下部分文字说明摘自<<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规范。

 

分享到:
评论

相关推荐

    Restlet实战(二十六)事务 (Transaction)

    本文将深入探讨RESTful服务中的事务处理,并以《Restlet实战(二十六)事务 (Transaction)》为例进行解析。 首先,我们要理解RESTful服务中的核心原则之一是无状态(Stateless)。这意味着每个客户端请求都包含处理...

    restlet

    4. **过滤器机制**:RESTlet的过滤器可以插入到请求和响应的处理流程中,用于执行预处理或后处理任务,如身份验证、日志记录、缓存控制等。 5. **安全性**:RESTlet提供了安全相关的工具和策略,如HTTPS支持、基本...

    Restlet开发的Basic认证

    REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性的Web服务。在这个"Restlet开发的Basic认证"示例中,我们将探讨如何在Restlet应用中实现HTTP基本认证,这是一种广泛使用的身份...

    org.restlet-2.3.0.jar 最新版本

    《深入理解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

    org.restlet.jar

    restlet2.1学习笔记项目代码

    Restlet是一个开源框架,专为构建RESTful(Representational State Transfer)Web服务而设计。REST是一种轻量级的架构风格,常用于构建可扩展、高性能的互联网应用程序。本项目是针对Restlet 2.1版本的学习笔记,...

    Restlet所需要的所有jar包

    Restlet是一款开源的Java框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的架构风格,常用于构建高效、可扩展的网络应用程序。本压缩包包含Restlet框架运行所需的全部jar...

    Restlet in Action

    ### Restlet in Action #### 书籍概述 《Restlet in Action》是一本详细介绍如何使用Java开发RESTful Web API的专业书籍。本书由三位作者共同完成:Jérôme Louvel、Thierry Templier 和 Thierry Boileau,并由...

    restlet-jee-2.0.3

    6. **Clustering and Caching**:对于企业级应用,Restlet支持集群和缓存功能,能够提高服务的可用性和性能。 7. **JAX-RS兼容性**:Restlet 2.x版本开始支持JAX-RS(Java API for RESTful Web Services),这使得...

    Restlet in action 英文 完整版

    第二章“Beginning a Restlet application”中,作者通过一个实际的例子引导读者逐步创建一个简单的Restlet应用。这包括设置开发环境、定义资源、处理HTTP方法(如GET、POST等)以及配置服务器。这一章节对于初学者...

    RESTLET开发

    ### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...

    Restlet开发实例

    接下来,我们进入"RESTLET开发实例(二)使用Component、Application的REST服务.doc"。在Restlet框架中,Component是整个应用的基础,它负责管理和协调多个Application。Application则是实际处理HTTP请求的实体,它...

    RESTLET IN ACTION

    这一章涉及了如何优化Restlet应用的性能,包括缓存策略、异步处理、负载均衡等方面。这些高级主题对于构建高效、可靠的Web服务至关重要。 ### 第三部分:进一步使用可能性 #### 9. 在云端部署一个Restlet应用 ...

    Restlet Client 插件安装包

    **Restlet Client插件安装包详解** 在现代的Web应用开发中,API(Application Programming Interface)扮演着至关重要的角色,尤其是RESTful API,它已成为构建分布式系统和微服务架构的标准。为了有效地测试和调试...

    RESTLET框架学习书籍

    #### 二、RESTLET框架的基础架构 - **RESTLET的基本概念**: - **Resources**:表示RESTLET中的资源,是RESTLET应用的核心组件,用于处理特定URL的HTTP请求。 - **Filters**:过滤器用于拦截请求和响应,实现如...

    restlet实现最简单的restful webservice

    Restlet是一款开源框架,专为构建RESTful Web服务和客户端应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛用于构建互联网应用,因为它提供了高效、分布式的系统设计原则。本文...

    restlet项目

    Restlet项目是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种软件架构风格,它强调简洁、可扩展性和无状态性,是Web服务设计的主流方式。Restlet框架提供了全面的工具集...

    基于Spring的Restlet实例

    通过这个基于Spring的Restlet实例,开发者可以学习到如何在Spring环境下创建和管理REST服务,同时利用Spring的高级特性如事务管理、缓存控制等提升服务的性能和可靠性。这种结合方式为开发高质量、可维护的RESTful ...

    Restlet与Spring 集成

    Restlet与Spring集成是将Restlet框架与Spring框架结合,以增强RESTful服务的开发能力。Restlet是一个轻量级的Java框架,专门用于构建REST(Representational State Transfer)架构风格的应用程序。它遵循JAX-RS...

Global site tag (gtag.js) - Google Analytics