1、背景介绍
在涉及到网络请求的场景中,网络协议是必不可少的组件。但是针对不同的应用程序,网络协议又大不相同。一般来说,不涉及到资金操作的网络请求,并不需要做过多的协议处理,一般常见的数据结构就可以了。但是在一些特定的场合,比如说购物,涉密文件信息这样的信息在传送的时候,一定要有特殊的协议去传送。
这里简单介绍一个购物时候,使用到的一个协议的封装。
2、发送协议
<?xml version=”1.0” encoding=”utf-8”?> <product version="1.2"> <header> <agenterid>568941</agenterid> <source>ivr</source> <compress>DES</compress> <messengerid>201411131045215896412</messengerid> <timestamp>20141113104521</timestamp> <digest>7ec8582632678032d25866bd4bce114f</digest> <transactiontype>287910</transactiontype> <username>78145652515141</username> </header> <body> <elements> <element> <chooseid>10</chooseid> <issues>2</issues> </element> </elements> </body> </product>
这是选中商品的协议,可以看到分为两个部分,header头部和body正文部分。
3、协议解析
3.1 解析图示
在上面,我们看到协议的明文示例,那么根据上面的xml文件,我们可以整理出如下的解析图示:
3.2 常量分析
<agenterid>568941</agenterid>agenterid:代理id
<source>ivr</source>
<compress>DES</compress>
body里面的数据加密的算法
3.3 简单代码处理
<timestamp>20141113104521</timestamp>时间戳:SimpleDataformat
<messengerid>201411131045215896412</messengerid>
时间戳+六位的随机数
SimpleDataformat+Random+六位(数字的格式化DecimalFormat)
<digest>7ec8582632678032d25866bd4bce114f</digest>
数据摘要:MD5
MD5的原始数据的组成:时间戳+代理的密码+完整body(明文)
3.4 无法处理
<transactiontype>287910</transactiontype>请求的唯一的标示
<username>78145652515141</username>
用户名,自动登录
4、接收协议
有了上面协议的分析基础,我们这里就直接给出接收协议的xml明文,不再过多解释其中的含义。接收协议的明文也是一个xml文件定义:
<?xml version='1.0' encoding='utf-8' ?> <product version="1.2"> <header> <messengerid>201411131045215896412</messengerid> <timestamp>20141113104521</timestamp> <transactiontype>12002</transactiontype> <digest>7ec8582632678032d25866bd4bce114f</digest> <compress>DES</compress> <agenterid>568941</agenterid> </header> <body> <oelement> <errorcode>0</errorcode> <errormsg>操作成功</errormsg> </oelement> <elements> <element> <chooseid>10</chooseid> <choosename>茶叶</choosename> <issue>2012070</issue> <lasttime>86400</lasttime> </element> </elements> </body> </product>
5、协议解析总结
在做协议封装的时候,一般只需要封装关键的信息,一些常量或者说一些简单的数据,并没有太大的封装意义,比如上面这条消息的id值,时间戳就没有太大的封装意义,但是选中的商品信息,商品的数量信息,这类敏感型数据,应当做一个加密的操作。
在协议的封装过程中,我们应该在前期的设计中,考虑到协议的可扩展性,比如上面的elements这样的一个节点,里面好像也只有一个element元素,那么外层的elements节点似乎就很多于。实际上呢?我们这里只是给出了一个示例而已,这里用户仅仅是选择了茶叶这样一个元素,那么试想一下,在购买商品的时候,用户购买了多个商品,我们又该如何处理这个协议呢?