ios开发——实用技术篇&XML协议详解

XML的数据协议组成


名词


说明


md5


message-digest algorithm 5


http


hypertext transfer protocol


xml


extensible markup language

交易交互是以http协议作为数据传输协议,这里定义发起交易请求的一端为客户端,客户端需要以http post 数据流(非表单方式)的方式提交交易请求,如下所示:

假设有一个查询指定玩法可销售期信息的交易请求,那么http消息体的内容如下:

 1 <?xml version=”1.0” encoding=”utf-8”?>
 2
 3 <message version="1.0">
 4
 5         <header>
 6
 7                <messengerid>20091113101533000001</messengerid>
 8
 9                <timestamp>20091113101533</timestamp>
10
11                <transactiontype>12002</transactiontype>
12
13                <digest>7ec8582632678032d25866bd4bce114f</digest>
14
15                <agenterid>889931</agenterid>
16
17                <source>ivr</source>
18
19                <username>张三</username>
20
21                <compress>DES</compress>
22
23         </header>
24
25         <body>
26
27                 <elements>
28
29                         <element>
30
31                                 <lotteryid>118</lotteryid>
32
33                                 <issues>1</issues>
34
35                         </element>
36
37                 </elements>
38
39         </body>
40
41 </message>

注:实际http传输中,对内容进行编码,编码字符集utf-8(这主要是考虑到AJAX传输过程是以UTF-8编码)。

开发过程中会遇到这种情况,明明已经发送数据到服务器了,可是服务器收不到数据,遇到这种问题时的处理办法是,查看一下发送程序代码,是否进行了如下设置:

‘content-type’, ‘application/x-www-form-urlencoded’

如果有,去除,或者修改成:

‘content-type’,‘text/xml charset=utf-8‘

1.0、消息包

每一个请求/响应的消息包都是一个xml,包含消息头和消息体,对于不同类型的请求/响应,消息头的格式是相同的,而消息体会携带具体的类型的请求/响应信息。请参照下面的消息包格式定义。

 1 <?xml version=”1.0” encoding=”utf-8”?>
 2
 3 <message version="1.0">
 4
 5 <header>
 6
 7 <messengerid>200911131015330000000001</messengerid>
 8
 9 <timestamp>20091113101533</timestamp>
10
11 <transactiontype>102</transactiontype>
12
13 <username>张三</username>
14
15 <digest>7ec8582632678032d25866bd4bce114f</digest>
16
17 <agenterid>800001</agenterid>
18
19 </header>
20
21 <body>
22
23 <elements>
24
25 <element>
26
27 < lotteryname >D11</lotteryname>
28
29 <issue>2009111301</issue>
30
31 </element>
32
33 </elements>
34
35 </body>
36
37 </message>

整个消息包是一个xml字符串,首先声明xml的版本和编码,这里定义encoding为utf-8。在消息包元素message中声明了version属性,表示该消息包使用的数据通信协议的版本,当前为1.0

1.1消息头

消息头对于所有的交易请求以及对每个交易请求的请求/响应都具有同样的数据结构。请参照下面的消息体格式定义。

在后面对交易请求消息体的描述中不再重复说明消息头的结构。

 

 1 <header>
 2
 3 <messengerid>20091113101533000001</messengerid>
 4
 5 <timestamp>20091113101533</timestamp>
 6
 7 <transactiontype>102</transactiontype>
 8
 9 <digest>7ec8582632678032d25866bd4bce114f</digest>
10
11 <agenterid>800001</agenterid>
12
13 <username>张三</username>
14
15 <source>ivr</source>
16
17 <ipaddress>33.22.11.22</ipaddress >
18
19 <compress>DES</compress>加密用的标签:使用什么方式加密(DES)
20
21 </header>

header 元素定义了消息头的数据结构,其中:


名称


类型


长度


描述


messengerid


String


20


消息编号,格式为

yyyymmddhh24miss+六位递增序号。注:在非大客户模式下,可以为空。


timestamp


String


14


格式为:yyyymmddhh24miss或者yyyy-mm-dd hh24:mi:ss


transactiontype


String


3


交易类型,详见附件


agenteridid


String


6


代理编号


username


String


<16


用户账号


digest


String


32


对消息包的摘要,摘要算法为md5,摘要内容为(时间戳+代理密码+消息体)


source


String


16<=


用户操作终端来源,如:ivr,sms,web等。


ipaddressaddress


String


20<=

对于digest部分,表中已经定义了需要对消息体的哪些部分进行摘要,这里需要进行更进一步的说明,其中:

l  代理商密码:彩票支撑系统会为每个投注代理商分配一个交易访问密码,这个密码不会在消息中直接传输。无论是投注代理商向彩票支撑系统发送消息还是彩票支撑系统向某个代理发送消息,都会使用投注代理商的密码来执行摘要。

l  消息体: 消息包中body元素部分,包含<body>与</body>。

假如一个数据包的格式如下:

 1 <?xml version=‘1.0‘ encoding=‘utf-8‘ ?>
 2
 3 <message version="1.0">
 4
 5     <header>
 6
 7         <messengerid>200911131015330000000001</messengerid>
 8
 9         <timestamp>20091113101533</timestamp>
10
11         <transactiontype>12002</transactiontype>
12
13         <digest>7ec8582632678032d25866bd4bce114f</digest>
14
15         <compress>DES</compress>
16
17         <agenterid>800001</agenterid>
18
19     </header>
20
21     <body>
22
23         <oelement>
24
25                 <errorcode>0</errorcode>
26
27                 <errormsg>操作成功</errormsg>
28
29         </oelement>
30
31         <elements>
32
33                 <element>
34
35                         <lotteryid>118</lotteryid>
36
37                         <lotteryname>双色球</lotteryname>
38
39                         <issue>2012070</issue>
40
41                         <lasttime>86400</lasttime>
42
43                 </element>
44
45         </elements>
46
47     </body>
48
49 </message>
50
51
52
53 <?xml version="1.0" encoding="utf-8"?>
54
55 <message version="1.0">
56
57     <header>
58
59        <messengerid>20091113101533000001</messengerid>
60
61        <timestamp>20091113101533</timestamp>
62
63        <transactiontype>12002</transactiontype>
64
65        <digest>041a1f10e7cd9fe5531a61f8bdef5faa</digest>
66
67        <compress>DES</compress>
68
69        <agenterid>1000002</agenterid>
70
71     </header>
72
73     <body>HmtGfqfbbCvzJvIvv+HjhHmbzgj+JRAutc2wOfw9+rsKAEKJX79jf2chPUk9XZTaMYphue6K/FeOZ3BNFjdnPsPvvL/1/vA75iGWiU8zKDYa9/jKDwz3Rbe1X6m3hamZPMLXz7FSXnD/Ur/BTZqfmta+0yJuMPGcWQEFjVnO/10amdeXoQDJDjP9gmOWb7r7WiMcXRYTSTmH1F8a5a1tVXQnK6WU4fmDkCU1Yq+RAowxwAH9VzvZiOP8ISyCGHpYPCADWcvpE5RtH0Le674kW29XIisxTJvcVhuDDamnMa0=
74
75     </body>
76
77 </message>

那么,被摘要的字串应该是(假设投注代理商的密码为111111)

111111<body><oelement><errorcode>0</errorcode><errormsg>操作成功</errormsg></oelement><elements><element><lotteryid>D11</lotteryid><issue>2009111301</issue></element></elements></body>

被摘要的body元素部分应该保留消息字串中的所有格式信息,比如空格,回车符等。

 

1.2 协议中协议头使用说明

协议头中包含一些通用的信息,对于系统中不同的环节,有些协议字段可以不填,有些协议字段需要在应用服务器端填写后,发送到无纸化平台。

 1 <header>
 2
 3 <messengerid>200911131015330000000001</messengerid>
 4
 5 <timestamp>20091113101533</timestamp>
 6
 7 <transactiontype>102</transactiontype>
 8
 9 <digest>7ec8582632678032d25866bd4bce114f</digest>
10
11 <agenterid>800001</agenterid>
12
13 </header>

 

对于:flash,ajax + js等客户端模式下,messengerid,digestagenteridusername等字段是不需要填写的。这些信息可以在服务端由具体的服务平台进行被充填写。因为有些安全信息,是不能在用户的电脑上执行的。

附录A:DES数据加密

为了数据的安全,XML协议在传输过程中,可以使用加密处理。

1、  数据按照PKCS5规则进行补位.(缺7位补7个0x07,缺6位则补6个0x06,以次类推,如果正好8位,也需要补8个0x08)。

2、  实际加密模式选择DES-ECB。

3、  经过DES加密后的数据必须通过Base64编码转换为明文的字符串。

在XML约定协议的header部分中,增加一个标签compress,如:<compress>DES</compress>,DES标明为加密的类型,如下:

  1 <?xml version=”1.0” encoding=”utf-8”?>
  2
  3 <message version="1.0">
  4
  5 <header>
  6
  7 <messengerid>200911131015330000000001</messengerid>
  8
  9 <timestamp>20091113101533</timestamp>
 10
 11 <transactiontype>102</transactiontype>
 12
 13 <digest>7ec8582632678032d25866bd4bce114f</digest>
 14
 15 <agenterid>800001</agenterid>
 16
 17 </header>
 18
 19 <body>
 20
 21 <oelement>
 22
 23 <errorcode>0</errorcode>
 24
 25 <errormsg>操作成功</ errormsg >
 26
 27 </oelement>
 28
 29 <elements>
 30
 31 <element>
 32
 33 <lotteryid>d11</lotteryid>
 34
 35 <issue>2009111301</issue>
 36
 37 </element>
 38
 39 </elements>
 40
 41 </body>
 42
 43 </message>
 44
 45
 46
 47 需要DES加密的数据:
 48
 49 <oelement>
 50
 51 <errorcode>0</errorcode>
 52
 53 <errormsg>操作成功</ errormsg >
 54
 55 </oelement>
 56
 57 <elements>
 58
 59 <element>
 60
 61 <lotteryid>d11</lotteryid>
 62
 63 <issue>2009111301</issue>
 64
 65 </element>
 66
 67 </elements>
 68
 69
 70
 71 加密后提交的数据包:
 72
 73
 74
 75 <?xml version=”1.0” encoding=”utf-8”?>
 76
 77 <message version="1.0">
 78
 79 <header>
 80
 81 <messengerid>200911131015330000000001</messengerid>
 82
 83 <timestamp>20091113101533</timestamp>
 84
 85 <transactiontype>102</transactiontype>
 86
 87 <digest>7ec8582632678032d25866bd4bce114f</digest>
 88
 89 <agenterid>800001</agenterid>
 90
 91 <compress>DES</compress>
 92
 93 </header>
 94
 95 <body>
 96
 97 =xxxxdafdfdsafsa==
 98
 99 </body>
100
101 </message>

附录B:数据DES加密与MD5的双重性问题。

MD5是在DES加密前进行的,MD5签名使用的密钥是用的渠道的密钥,DES加密数据使用的密钥是当前用户的密码明文经过MD5处理后,生成的长度为32字节的十六进制字符串的前16个字符。

比如:一用户的密码明文为:1234567890,经过MD5处理后,则数据转成为:e807f1fcf82d132f9bb018ca6738a19f,则进行DES加密数据时,密钥为:e0fff2129b1c63a9。

附录C:GZIP压缩传输

手机客户端与中间件接口传输与接收数据,均需要进行GZIP压缩传输,减少数据库传输流量。

时间: 2024-10-13 04:27:08

ios开发——实用技术篇&XML协议详解的相关文章

iOS开发——实用技术篇&amp;版本控制之Git的基本使用与总结

iOS开发——实用技术篇&版本控制之Git的基本使用与总结 updataing..............

iOS开发——实用技术篇&amp;版本控制之SVN的基本使用与总结

iOS开发——实用技术篇&版本控制之SVN的基本使用与总结 updataing..............

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

iOS开发——多线程OC篇&amp;多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

iOS开发——屏幕适配篇&amp;Masonry详解

Masonry详解 前言 1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 window的size固定为(320,480) 我们只需要简单计算一下相对位置就好了 在iphone4-iphone4s时代 苹果推出了retina屏 但是给了码农们非常大的福利:window的size不变 在iphone5-iphone5s时代 window的size变了(320,5

iOS开发——实用技术OC篇&amp;事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

iOS开发——UI篇OC&amp;transform详解

transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffineTransformMakeTranslation(平移) CGAffineTransformMakeScale(缩放) CGAffineTransformMakeRotation(旋转) (2) 创建“基于transform参数”的形变 CGAffineTra

ios开发——实用技术篇&amp;Pist转模型详细介绍

Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通过一定的方式返回的plist数据 一:直接加载Plist数据 1 //定义一个数组属性 2 @property (nonatomic, assign) NSArray *apps; 获取Plist文件 1 //懒加载plist文件,返回一个apps数据,后面直接使用旧可以 2 -(NSArray *