XML通信协议的封装
设计目的
Android 应用开发中不可避免会对网络数据进行访问,同样本项目中对于网络数据访问更加的频繁。不管是本地数据的上传还是从服务器下载数据,客户端APP与服务器之间都需要通信,而两台机器之间的通信必然需要一套互相都能够理解的规则,我们称之为“协议”。对于那些比较敏感的数据,更是要通过加密协议来保证网络传输数据的安全性。
设计思想
通过对开发中用到的所有通信协议分析,可以将通信协议分为两类,一类是发送协议,另一类是接收协议。对于协议封装的优点就是实现了请求接口(抽象)化和协议的通用化。我们可以对节点对象化和对节点序列化来封装协议。
通信过程中请求和响应消息包格式如下:
下面以获取首页推介图书信息请求为例来分析协议结构。节点对象有Message,Header,Body,Element,Leaf。其结构关系如图4.1所示:
图4.1 协议结构图
在节点序列化的过程中,序列化的顺序要遵循从内到外(XML),从下到上(结构图)的顺序,具体顺序为 Leaf,Header,Element,Body,Message 。Message节点对外提供请求参数入口方法和对外提供序列化的XML获取方法。所谓的请求接口(抽象)化,就是Element接口(抽象)化,所有的请求必须实现该接口或继承该抽象类,同时必须实现接口或抽象类中定义的请求类型标识和请求序列化方法。
具体实现
Message类中有私有属性header:Header和私有属性body:Body,公有方法 getXml(Element element):String,根据传入特定请求的element返回请求XML字符串。
Header类中有私有属性messengerid:Leaf、source :Leaf, compress:Leaf、timestamp :Leaf、digest:Leaf、 transactiontype:Leaf、username:Leaf。公有方法 serialize(XmlSerializerserializer):void,此方法用来序列化Header类中的属性(每一个属性都是一个叶子)。
Body类中有私有属性elements:List<Element>,用来存放回复数据,私有属性oElement:OElement 用来存放响应的状态代码及相对应的状态信息。私有属性element:Element 用来存放请求信息。公有方法 serialize():String,此方法可以将Body类中属性element序列化并返回序列化后的XML字符串。
Element 接口中定义了两个方法。抽象方法serializerElement(XmlSerializer serializer ):void ,子类实现该方法用来序列化子类中的属性(叶子)。抽象方法getTransactionType():String,该方法返回子类的请求码(请求码和Element类型相对应)。
Leaf类中有私有属性tagName:String和value:String ,分别表示标签名和标签值,类中公有方法serialize(XmlSerializerserializer):void 可以将tagName和value 序列化成XML格式。类图如图4.2所示:
图4.2 协议类图