本章主要是介绍如何编写一个简单的Web Service客户端服务,但是其中涉及到一些知识是之前我没有注意和研究过的,所以这一章学习一下还是很有用的。
封装库、WADL和ActiveResource
web服务用的是HTTP请求,但是HTTP请求的过程却是大同小异的,所以如果每次请求都要自己写整个过程的话确实比较麻烦,而且容易出bug。最好的方法是对它们进行封装,封装库
确实简化了web服务编程,但是还有一个问题就是这个封装库有很多种,没有一个统一的标准,于是又一个想法冒出来了:可不可以抽象服务间的差异,使一个封装库能够用于所有的REST式和混合式架构?答案当然是可以,了解SOAP的都知道有一个WSDL转本用来描述服务的格式。而REST社区就这个标准还没达成一致,这里作者推荐的是WADL作为面向资源的描述语言。
用HTTP库发送请求
不同的语言有不同的HTTP库来封装底层的HTTP请求,这里如果要构建一个完全通用的Web客户端,HTTP库需要具有以下特征:
- 必须支持HTTPS和SSL证书验证。主要是为了安全传输。
- 必须支持至少五个主要的HTTP方法:GET/HEAD/PUT/POST/DELETE。因为这是REST风格所必须的。
- 必须允许定制PUT或POST请求的实体主体数据。
- 必须允许定制请求的HTTP报头。
- 必须能够获取HTTP响应的响应代码及报头。
- 必须支持通过HTTP代理进行HTTP通信。
可选特性:
- 为了节省带宽,需要支持压缩的报头(Encoding)
- HTTP库能够自动把返回的响应缓存起来
- HTTP库应该透明的支持常见的HTTP认证形式
- HTTP库应该能够透明地作HTTP重定向
- HTTP库能够解析并创建HTTP cookie字符串
用XML解析器处理相应
这里重点的内容是XML的解析器的几种不同的原理。
有两种XML的解析策略:
- 基于文档的(document-based)策略(如DOM等树式解析器)
- 基于事件的(event-based)策略(如SAX及“拖”式解析器)
基于文档的策略
这种策略是最简单的,先把整个文档加载进来,然后根据XPath等把整个文档转换为树式结构,然后就可以处理所需的节点了。这种方案的缺点就是必须要有完整的XML文档才行。
SAX式或拖式(pull)解析器
这种是把XML文档转换为事件流,而不是数据结构。首标签(staring tag)、尾标签(closing tag)、XML注释(comments)及实体声明(entity declaration)等都是事件(event)。
如果每个事件都要处理则拖式解析器是很有用的。拖式解析器允许一次处理一个事件,处理完一个事件后再从事件流拖出下一个事件,是一个类似先进先出的链表。
如果只关心部分事件,那么SAX则更有用。向SAX解析器注册一些回调方法。一旦定义好回调方法,解析器将按照既定的、跟文档无关的步骤执行下去:解析器将把XML文档转换为一系列事件,并连接处理文档中的每个事件;每当一个事件与回调方法所对应的事件匹配时,解析器就会触发该回调方法,执行你定义的代码;回调方法执行结束后,SAX解析器将接着继续处理事件序列。关于PHP的基于事件的XML解析器可以参考php文档中的说明。
基于文档的解析器优点是:可以随机访问文档中的内容;而对于基于事件的解析器,事件触发以后就没有机会再处理了。如果XML格式有问题,基于事件的解析器直到遇到错误的地方才会报错和崩溃。
实际使用过程中可以根据自己的需求选择不同的XML文档解析器。