一个基于XML的传输协议解析

前端之家收集整理的这篇文章主要介绍了一个基于XML的传输协议解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1、背景介绍

在涉及到网络请求的场景中,网络协议是必不可少的组件。但是针对不同的应用程序,网络协议又大不相同。一般来说,不涉及到资金操作的网络请求,并不需要做过多的协议处理,一般常见的数据结构就可以了。但是在一些特定的场合,比如说购物,涉密文件信息这样的信息在传送的时候,一定要有特殊的协议去传送。

这里简单介绍一个购物时候,使用到的一个协议的封装。


2、发送协议

我们先看看发送协议的文件,如下XML文件

<?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节点似乎就很多于。实际上呢?我们这里只是给出了一个示例而已,这里用户仅仅是选择了茶叶这样一个元素,那么试想一下,在购买商品的时候,用户购买了多个商品,我们又该如何处理这个协议呢?

猜你在找的XML相关文章