ios开发——实用技术篇&XML协议详解
XML的数据协议组成
|
名词 |
说明 |
|
md5 |
message-digest algorithm 5 |
|
http |
hypertext transfer protocol |
|
xml |
extensible markup language |
交易交互是以http协议作为数据传输协议,这里定义发起交易请求的一端为客户端,客户端需要以http post 数据流(非表单方式)的方式提交交易请求,如下所示:
假设有一个查询指定玩法可销售期信息的交易请求,那么http消息体的内容如下:
<?xml version=”1.0” encoding=”utf-8”?>
<message version="1.0">
<header>
<messengerid>20091113101533000001</messengerid>
<timestamp>20091113101533</timestamp>
<transactiontype>12002</transactiontype>
<digest>7ec8582632678032d25866bd4bce114f</digest>
<agenterid>889931</agenterid>
<source>ivr</source>
<username>张三</username>
<compress>DES</compress>
</header>
<body>
<elements>
<element>
<lotteryid>118</lotteryid>
<issues>1</issues>
</element>
</elements>
</body>
</message>
注:实际http传输中,对内容进行编码,编码字符集utf-8(这主要是考虑到AJAX传输过程是以UTF-8编码)。
开发过程中会遇到这种情况,明明已经发送数据到服务器了,可是服务器收不到数据,遇到这种问题时的处理办法是,查看一下发送程序代码,是否进行了如下设置:
‘content-type’, ‘application/x-www-form-urlencoded’
如果有,去除,或者修改成:
‘content-type’,‘text/xml charset=utf-8'
1.0、消息包
每一个请求/响应的消息包都是一个xml,包含消息头和消息体,对于不同类型的请求/响应,消息头的格式是相同的,而消息体会携带具体的类型的请求/响应信息。请参照下面的消息包格式定义。
<?xml version=”1.0” encoding=”utf-8”?> <message version="1.0"> <header> <messengerid>200911131015330000000001</messengerid> <timestamp>20091113101533</timestamp> <transactiontype>102</transactiontype> <username>张三</username> <digest>7ec8582632678032d25866bd4bce114f</digest> <agenterid>800001</agenterid> </header> <body> <elements> <element> < lotteryname >D11</lotteryname> <issue>2009111301</issue> </element> </elements> </body> </message>
整个消息包是一个xml字符串,首先声明xml的版本和编码,这里定义encoding为utf-8。在消息包元素message中声明了version属性,表示该消息包使用的数据通信协议的版本,当前为1.0
1.1消息头
消息头对于所有的交易请求以及对每个交易请求的请求/响应都具有同样的数据结构。请参照下面的消息体格式定义。
注:在后面对交易请求消息体的描述中不再重复说明消息头的结构。
<header> <messengerid>20091113101533000001</messengerid> <timestamp>20091113101533</timestamp> <transactiontype>102</transactiontype> <digest>7ec8582632678032d25866bd4bce114f</digest> <agenterid>800001</agenterid> <username>张三</username> <source>ivr</source> <ipaddress>33.22.11.22</ipaddress > <compress>DES</compress>加密用的标签:使用什么方式加密(DES) </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>。
假如一个数据包的格式如下:
<?xml version='1.0' encoding='utf-8' ?>
<message version="1.0">
<header>
<messengerid>200911131015330000000001</messengerid>
<timestamp>20091113101533</timestamp>
<transactiontype>12002</transactiontype>
<digest>7ec8582632678032d25866bd4bce114f</digest>
<compress>DES</compress>
<agenterid>800001</agenterid>
</header>
<body>
<oelement>
<errorcode>0</errorcode>
<errormsg>操作成功</errormsg>
</oelement>
<elements>
<element>
<lotteryid>118</lotteryid>
<lotteryname>双色球</lotteryname>
<issue>2012070</issue>
<lasttime>86400</lasttime>
</element>
</elements>
</body>
</message>
<?xml version="1.0" encoding="utf-8"?>
<message version="1.0">
<header>
<messengerid>20091113101533000001</messengerid>
<timestamp>20091113101533</timestamp>
<transactiontype>12002</transactiontype>
<digest>041a1f10e7cd9fe5531a61f8bdef5faa</digest>
<compress>DES</compress>
<agenterid>1000002</agenterid>
</header>
<body>HmtGfqfbbCvzJvIvv+HjhHmbzgj+JRAutc2wOfw9+rsKAEKJX79jf2chPUk9XZTaMYphue6K/FeOZ3BNFjdnPsPvvL/1/vA75iGWiU8zKDYa9/jKDwz3Rbe1X6m3hamZPMLXz7FSXnD/Ur/BTZqfmta+0yJuMPGcWQEFjVnO/10amdeXoQDJDjP9gmOWb7r7WiMcXRYTSTmH1F8a5a1tVXQnK6WU4fmDkCU1Yq+RAowxwAH9VzvZiOP8ISyCGHpYPCADWcvpE5RtH0Le674kW29XIisxTJvcVhuDDamnMa0=
</body>
</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 协议中协议头使用说明
协议头中包含一些通用的信息,对于系统中不同的环节,有些协议字段可以不填,有些协议字段需要在应用服务器端填写后,发送到无纸化平台。
<header> <messengerid>200911131015330000000001</messengerid> <timestamp>20091113101533</timestamp> <transactiontype>102</transactiontype> <digest>7ec8582632678032d25866bd4bce114f</digest> <agenterid>800001</agenterid> </header>
对于:flash,ajax + js等客户端模式下,messengerid,digest,agenterid,username等字段是不需要填写的。这些信息可以在服务端由具体的服务平台进行被充填写。因为有些安全信息,是不能在用户的电脑上执行的。
附录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标明为加密的类型,如下:
<?xml version=”1.0” encoding=”utf-8”?> <message version="1.0"> <header> <messengerid>200911131015330000000001</messengerid> <timestamp>20091113101533</timestamp> <transactiontype>102</transactiontype> <digest>7ec8582632678032d25866bd4bce114f</digest> <agenterid>800001</agenterid> </header> <body> <oelement> <errorcode>0</errorcode> <errormsg>操作成功</ errormsg > </oelement> <elements> <element> <lotteryid>d11</lotteryid> <issue>2009111301</issue> </element> </elements> </body> </message> 需要DES加密的数据: <oelement> <errorcode>0</errorcode> <errormsg>操作成功</ errormsg > </oelement> <elements> <element> <lotteryid>d11</lotteryid> <issue>2009111301</issue> </element> </elements> 加密后提交的数据包: <?xml version=”1.0” encoding=”utf-8”?> <message version="1.0"> <header> <messengerid>200911131015330000000001</messengerid> <timestamp>20091113101533</timestamp> <transactiontype>102</transactiontype> <digest>7ec8582632678032d25866bd4bce114f</digest> <agenterid>800001</agenterid> <compress>DES</compress> </header> <body> =xxxxdafdfdsafsa== </body> </message>
附录B:数据DES加密与MD5的双重性问题。
MD5是在DES加密前进行的,MD5签名使用的密钥是用的渠道的密钥,DES加密数据使用的密钥是当前用户的密码明文经过MD5处理后,生成的长度为32字节的十六进制字符串的前16个字符。
比如:一用户的密码明文为:1234567890,经过MD5处理后,则数据转成为:e807f1fcf82d132f9bb018ca6738a19f,则进行DES加密数据时,密钥为:e0fff2129b1c63a9。
附录C:GZIP压缩传输
手机客户端与中间件接口传输与接收数据,均需要进行GZIP压缩传输,减少数据库传输流量。
ios开发——实用技术篇&XML协议详解的更多相关文章
- iOS开发--常用技巧 (MJRefresh详解)
iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...
- iOS开发——多线程OC篇&多线程详解
多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...
- iOS开发——屏幕适配篇&Masonry详解
Masonry详解 前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-ip ...
- iOS开发——实用技术OC篇&事件处理详解
事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType type; @property(nonatomic ...
- ios开发——实用技术篇&Pist转模型详细介绍
Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...
- iOS开发——UI篇OC&transform详解
transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基 ...
- ios开发——实战OC篇&FMDB详解
FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...
- ios开发——实用技术篇&网络音频播放
网络音频播放 在日常的iOS开发中,我们通常会遇到媒体播放的问题,XCode中已经为我们提供了功能非常强大的AVFoundation框架和 MediaPlayer框架.其中AVFoundation框架 ...
- iOS开发中UIPopoverController的使用详解
这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController ...
随机推荐
- bjfu1164 Parity Game
简单规律题.首先想到的是,若01串中1有n个,则可以通过操作,使串中1的个数变为n-1.n-2……1.0个:第2个想到的是,如果n为奇数,可以通过操作,使串中1的个数最多变为n+1,而若n为偶数,则无 ...
- 《Python基础教程(第二版)》学习笔记 -> 第七章 更加抽象
对象的魔力 多态:意味着可以对不同类的对象使用同样的操作: 封装:对外部世界隐藏对象的工作细节: 继承:以普通的类为基础建立专门的类对象 多态① 多态和方法绑定到对象特性上面的函数称为方法(metho ...
- 关于CodeBlocks中stdc++-6.dll缺失的小问题
前一阵子在用CodeBlocks刷OJ(也并不是什么很难的算法,背包问题而已)时,遇到了个小麻烦,按下F9编译运行(有的人习惯用鼠标去点那个小button,多麻烦啊)后,Windows给我跳出个小窗说 ...
- 使用JSP处理用户注册和登陆
1. 这是一个JSP实例,由四个JSP页面组成,处理用户的注册和登陆信息2. 首先是login.jsp,代码如下:<html><center><form method=g ...
- python中的类型转换
函数 描述 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 float(x ) 将x转换到一个浮点数 complex(real [,imag ...
- [算法] 插入排序 Insertion Sort
插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-pla ...
- Downloading the Google Cloud Storage Client Library
Google Cloud Storage client是一个客户端库,与任何一个生产环境使用的App Engine版本都相互独立.如果你想使用App Engine Development server ...
- 实现 Web 后端和客户端之间的分布式和认证通讯
stack.io 是一个用于实现 Web 后端和客户端之间的分布式和认证通讯. 服务器端进程之间的通讯是非常高效的,因为没有中间的代理.而来自客户端的请求通过 socket.io 进入 Node.js ...
- [转]SQL中char、varchar、nvarchar的区别
char char是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. nvarcha ...
- 最大连续子数组问题2-homework-02
1) 一维数组最大连续子数组 如第homework-01就是一维数组的最大子数组,而当其首位相接时,只需多考虑子数组穿过相接的那个数就行了! 2)二维数组 算法应该和第一次的相似,或者说是将二维转化为 ...