- 浏览: 251832 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
fjdingsd:
目前基于REST的Java框架不包括Jersey吗
Hello REST!!! -
qq690388648:
不错,说的很好!
Restlet实战(十四)如何在Restlet得到Servlet request和Session -
zhuanbiandejijie:
唉... 你09年就接触Restlet了.15年我才开始看Re ...
Hello REST!!! -
zmjiao:
client.options( 这个是那个包下面的? rest ...
Restlet实战(十八)Restlet如何产生WADL -
shihezichen:
对于最近很多人都在讨论的, 使用REST时就不应该掺杂事务的看 ...
Restlet实战(二十六)事务 (Transaction)
在进入代码部分之前,还是贴出<<RESTful Web Service>>里对压缩的说明,毕竟这是本非常不错的书,而且书上说的比较清晰明了。
象XML文档这种文本格式的表示可以又很大的压缩率。HTTP客户端可以请求一个压缩版的表示,并为用户进行 透明的解压。其工作原理是这样的:客户端在发送HTTP请求时,在Accept-Ecoding包头里指出客户端支持那些 压缩算法。Accept-Encoding抱头又两个标准的值:compress和gzip GET /resource.html HTTP/1.1 Host: www.example.com Accept-Encoding: gzip, compress 若服务器支持Accept-Ecoding请求报头里指出的压缩算法,那么它将先对表示进行压缩,然后再发给客户端。 Content-type响应报头的值不会因为服务器是否压缩而改变。但是服务器会再响应里附上一个 Content-Encoding报头,这样客户端就知道服务器返回的表示有没有压缩: 200 OK Content-Type : text/html Content-Encoding: gzip 客户端再收到服务器的响应后,将先用Content-Encoding响应报头里指出的算法来解压缩数据,然后按照 Content-Type响应报头指出的媒体类型来处理解压缩后的数据。通过采用压缩技术,只需增加少许复杂性就 可以节省大量带宽。
下面我们结合两种情况看看如何实现压缩(使用Restlet作为服务器和客户端):
1. 客户端向服务器发送GET请求,服务器返回一个压缩的表示给客户端
首先客户端发送请求,并指出客户端支持那些压缩算法:
Reference reference = new Reference("http://localhost:8080/restlet/resources/users/1"); Request get = new Request(Method.GET, reference); List<Preference<Encoding>> encodings = new ArrayList<Preference<Encoding>>(); Preference<Encoding> pref = new Preference<Encoding>(Encoding.GZIP, 1.0f); encodings.add(pref); pref = new Preference<Encoding>(Encoding.COMPRESS, 0.5f); encodings.add(pref); get.getClientInfo().setAcceptedEncodings(encodings); Client client = new Client(Protocol.HTTP); Response response = client.handle(get);
/users/{userId}对应的资源是UserResource,那么服务器端接收到请求后,会做什么处理呢?服务器会首先判断客户端是否可以接受压缩的表示,并且支持那些算法,然后根据支持压缩算法的优先级别来决定使用那种算法来压缩表示。这里,为了测试方便,假设服务器端只支持GZIP算法,代码如下:
@Override public void handleGet() { boolean isGZIP = false; List<Preference<Encoding>> encodings = getRequest().getClientInfo().getAcceptedEncodings(); if (encodings != null) { for (Preference<Encoding> pre : encodings) { if (pre.getMetadata().equals(Encoding.GZIP)) { isGZIP = true; break; } } } Representation representation = null; if(isGZIP){ representation = new EncodeRepresentation(Encoding.GZIP, new StringRepresentation(getUserXml(), MediaType.TEXT_PLAIN)); }else{ representation = new StringRepresentation(getUserXml(user), MediaType.TEXT_PLAIN); } getResponse().setStatus(Status.SUCCESS_OK); getResponse().setEntity(representation); }
同样为了测试方便,我硬编码了一个压缩前的表示内容:
private String getUserXml(){ StringBuffer userXml = new StringBuffer(); userXml.append("<user id=\"1\">"); userXml.append("<name>ajax</name>"); userXml.append("<phone>13888888888</phone>"); userXml.append("<email>ajax@iteye.com</email>"); userXml.append("<address>Shanghai</address>"); userXml.append("</user>"); return userXml.toString(); }
至此,服务器端处理完成,那么客户端接收到服务器端返回的响应后,需要解压缩,当然了,需要首先判断服务器端使用的是那种压缩算法,看代码:
List<Encoding> _encodings = response.getEntity().getEncodings(); boolean isGZIP = false; if (_encodings != null) { for (Encoding encoding : _encodings) { if (encoding.equals(Encoding.GZIP)) { isGZIP = true; break; } } } Representation rep = response.getEntity(); if(isGZIP){ rep = new DecodeRepresentation(response.getEntity()); } String testText = rep.getText();
过程比较简单,不再多做解释。
2.客户端发送POST请求到服务器端,并且附送一个压缩的表示。
这种情况一般是客户端在请求时附送的表示非常耗费服务器资源,占用带宽,例如某些XML表示。为了测试,这里没有同服务器端反复协商的过程,直接发送使用GZIP压缩算法压缩过的表示。
Reference reference = new Reference("http://localhost:8080/restlet/resources/users/1"); Client client = new Client(Protocol.HTTP); Representation representation = new EncodeRepresentation(Encoding.GZIP, new StringRepresentation(getUserXml(), MediaType.TEXT_PLAIN)); Response response = client.post(reference, representation); assertTrue(response.getStatus().isSuccess());
看看服务器端怎么处理:
@Override public void acceptRepresentation(Representation entity) throws ResourceException { try { String text = getRequest().getEntity().getText(); System.out.println(text); } catch (IOException e1) { e1.printStackTrace(); } }
咦,貌似不对,既然客户端压缩了表示,为什么服务器端没有解压缩? 是的,Restlet已经自动的做了解压缩,Restlet目前支持的压缩算法有:看DecodeRepresentation中的一段源代码:
public static List<Encoding> getSupportedEncodings() { return Arrays.<Encoding> asList(Encoding.GZIP, Encoding.DEFLATE, Encoding.ZIP, Encoding.IDENTITY); }
那假设服务器端和客户端有自己约定的压缩算法,而这个算法又不在Restlet支持之列,怎么处理这种情况?可以在Application的实例中禁止进行解压缩:
getDecoderService().setEnabled(false);
这样,就可以使用约定的压缩算法进行相应的压缩与解压缩了。
发表评论
-
Restlet实战(三十)(完结篇)运行流程之源代码分析(续)
2009-08-24 14:25 4119前面一篇文章分析了servlet里init方法,包括init方 ... -
Restlet实战(二十九)(完结篇)运行流程之源代码分析
2009-08-20 17:32 5230终于到了完结篇,也体 ... -
Restlet实战(二十八)源代码分析之压缩 (Compression)
2009-08-10 15:36 3200上篇文章我给出了如何 ... -
Restlet实战(二十六)事务 (Transaction)
2009-08-02 23:29 5323<<Restful Web Service> ... -
Restlet实战(二十五)缓存 (Cache)
2009-07-31 22:18 3942说明:以下部分文字说明摘自<<Restful We ... -
Restlet实战(二十四)获取参数值(续)
2009-07-31 14:44 10367这个系列之前已经有一篇文章写如何获取参数值,看Restlet实 ... -
欢迎加入Restlet圈子
2009-07-28 22:28 2757如果你进来是因为想看Restlet相关的文章,那么欢迎你加入r ... -
Restlet实战(二十三)实现条件GET (Conditional Get)
2009-07-28 17:47 4998先普及一下什么是条件GET,以下摘自<<Restf ... -
Restlet实战(二十二)仿造PUT和DELETE
2009-07-28 13:17 7152在Restlet实战(七)-提交和处理Web Form 中提到 ... -
Restlet实战(二十一)如何保护确定的资源(续)
2009-07-16 16:18 3962在Restlet实战(十七)如何保护确定的资源 中我给出一个如 ... -
Restlet实战(二十)使用Restlet之SSL
2009-07-15 21:37 3267待写 -
Restlet实战(十九)使用Restlet实现Web Service
2009-07-15 21:34 4283先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Re ... -
Restlet实战(十八)Restlet如何产生WADL
2009-07-11 21:57 9802现在究竟REST是否需要WADL这种东西,有很多争论,有人说不 ... -
Restlet实战(十七)如何保护确定的资源
2009-07-11 21:55 3392在面向资源的架构中, ... -
Restlet实战(十六)结合源代码分析及使用Filter
2009-07-11 21:13 5709其实在Web应用中Filter对大家来说一点都不陌生,比如说在 ... -
Restlet实战(十五)如何与表示层交互
2009-07-10 13:51 5329首先还是设定一个应用场景,看看用restlet如何实现。 ... -
Restlet实战(十四)如何在Restlet得到Servlet request和Session
2009-07-09 16:39 11489如果你现在已经有一个web系统,而为了一些需求,你集成了res ... -
Restlet实战(十三)如何在Servlet中呼叫Restlet
2009-07-09 14:47 4500看到这个题目,或许你会问,你之前的很多文章不都是与servle ... -
Restlet实战(十二)获取参数值
2009-07-07 15:06 6908本篇文章将讲解三种不 ... -
Restlet实战(十一)结合源代码修改Restlet-Spring配置文件
2009-07-04 23:56 6129上篇文章结合了Restlet的源码分析了Restlet-spr ...
相关推荐
NULL 博文链接:https://ajaxcn.iteye.com/blog/438237
RESTLET开发实例(二)使用Component、Application的REST服务
restlet相关文档
org.restlet.jar
restlet项目
Restlet与Spring 集成
一个简单的Restlet开发框架的Basic认证的例子
Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...
restlet2.1学习笔记项目代码
Restlet所需要的所有jar包 一次下载,以后高枕无忧!
restlet入门helloworld示例
本文是对Restlet官方教程http://restlet.com/learn/tutorial/2.2/的中文翻译。
RESTLET框架学习书籍
Restlet2.0用户指南
资源里面包含了Restlet从入门到高级的开发过程,对学习Restlet有很大的帮助
restlet restful,web工程,可直接运行。启动后,main方法作为client运行调用服务端。服务器数据之间沟通利器,绝对不坑。
restlet工程示例,restlet工程小例子
Restlet Client 插件是一个类似Postman的Api接口测试工具, 界面友好, UI布局也更合理。相比Postman, Restlet Client无需安装本地客户端, 即装即用, 占用空间小, 功能强大。
RESTLET开发实例(一)基于JAX-RS的REST服务