我讲移动的短信同步接口用delphi实现
首先来说说什么是同步接口,就是移动的短信,如果有一个手机定制了公司某个栏目上,移动会通过一个www.的地址,post过来一个xml的文档
移动的IVR,或联通的 都要求有这样的接口,用于处理用户的定制以即取消请求。
而我们所实现的就是做一个WWW的服务器,接收这个XML文档,然后分析,对自己的数据做更新,然后回复一个XML文档
大家不要一看到WWW就想到IIS,或TOMCAT一类的,其实delphi也可以做WWW服务器
在delphi6.0中有一个控件叫indyhttpserver
大家可以在控件栏中找到它。
你把这个东东一放到你的窗体上,然后设置它的bindings属性
这样一个WWW服务器就出来了,剩下的就是做一些交互操作。如果客户端POST过来一个XML文档,我们要怎么获得这个文档呢,答案就在这个事件中。在这个事件中就是对用户的请求做出反应的一个事件。我的处理代码如下,然后我一行一行来讲解
Tel, ActionID, mdn, transactionid, Re: WideString;
begin
if ((RequestInfo.Command = 'POST')) then begin
Re := RequestInfo.UnparsedParams;
Memo1.Lines.Add(RequestInfo.UnparsedParams);
transactionid := MyGet(copy(Re, Pos('<TransactionID', Re) + 14, 100));
Tel := MyGet(copy(Re, Pos('<MSISDN>', Re) + 8, 100));
ActionID := MyGet(copy(Re, Pos('<ActionID>', Re) + 10, 100));
if(ActionID = '2') then begin
if ((MyGet(copy(Re, Pos('<SPServiceID>', Re) + 13, 100)) = '-0605700') ) then
ADOCommand1.commandText := 'Insert into Indata (did,cid,context,slrq) values ('''
+ Tel + '''' + ',''' + MyGet(copy(Re, Pos('<SPServiceID>', Re) + 14, 100)) + ''''
+ ',''' + 'QZQX' + '''' + ',''' + DateTimeToStr(Now())+''')'
else
ADOCommand1.commandText := 'Insert into Indata (did,cid,context,slrq) values ('''
+ Tel + '''' + ',''' + MyGet(copy(Re, Pos('<SPServiceID>', Re) + 14, 100)) + ''''
+ ',''' + 'QZQX' + '''' + ',''' + DateTimeToStr(Now())+''')';
Memo1.Lines.Add(ADOCommand1.commandText);
end;
if(ActionID = '1') then begin
if ((MyGet(copy(Re, Pos('<SPServiceID>', Re) + 13, 100)) = '-0605700') ) then
ADOCommand1.commandText := 'Insert into Indata (did,cid,context,slrq) values ('''
+ Tel + '''' + ',''' + MyGet(copy(Re, Pos('<SPServiceID>', Re) + 14, 100)) + ''''
+ ',''' + 'QZ' + '''' + ',''' + DateTimeToStr(Now())+''')'
else
ADOCommand1.commandText := 'Insert into Indata (did,cid,context,slrq) values ('''
+ Tel + '''' + ',''' + MyGet(copy(Re, Pos('<SPServiceID>', Re) + 14, 100)) + ''''
+ ',''' + 'GL' + '''' + ',''' + DateTimeToStr(Now())+''')';
Memo1.Lines.Add(ADOCommand1.commandText);
end;
ADOCommand1.Execute;
mdn := '<?xml version="1.0" encoding="utf-8"?>'
+ '<SOAP-ENV:Envelope'
+ ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
+ ' xmlns:xsd="http://www.w3.org/2001/XMLSchema"'
+ ' xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"'
+ ' xmlns:SOAP-ENC="'">http://schemas.xmlsoap.org/soap/encoding/">'
+ '<SOAP-ENV:Header>'
+ '<TransactionID'
+ transactionid;
mdn := Mdn + '</TransactionID>'
+ '</SOAP-ENV:Header>'
+ '<SOAP-ENV:Body>'
+ '<SyncOrderRelationResp xmlns=' + '"'">http://www.monternet.com/dsmp/schemas/">'
+ '<MsgType>SyncOrderRelationResp</MsgType>'
+ '<Version>1.5.0</Version>'
+ '<hRet>0</hRet>'
+ '</SyncOrderRelationResp>'
+ '</SOAP-ENV:Body>'
+ '</SOAP-ENV:Envelope>';
ResponseInfo.ContentText := MDn;
大家把窗口最大化来看
if ((RequestInfo.Command = 'POST')) then begin
首先看这行,这行是看用户的请求是不是POST请求
如果是get请求则不予理睬
Re := RequestInfo.UnparsedParams;
而这一行就是关键了,这行就是取出用户POST过来的XML文档
在这里,对我们而言它只是一个字符串,大家在下面就可以参照移动的相关协议对自己的数据库做相关处理
ResponseInfo.ContentText := MDn;而这句,就是将要回复的信息回复给客户端
如果大家只想做一个简单的服务器那么就只需要加上一行。
ResponseInfo.ContentText := "hell word!!";
然后设置一下你的idhttpserver.bindings
为你自己的IP加端口,如192.168.1.1:80
然后把idhttpserver的active设为true
然后运行,然后打开你的IE输入192.168.1.1
你就会看到hello word了。呵呵!
这里避开了对XML的解析。因为移动的XML比较简单。不需要XML解析器基本就能搞定
在这里,如果大家想让自己的程序加上WWW的功能,在这里不失为一个好方法,比较实用,
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------
成都-兔烧(368242315) 10:22:20
怎么加上?
种瓜的(40140203) 10:23:03
放上那个控件啊,然后在 里面加上你想要显示给客户的内容就成了
种瓜的(40140203) 10:23:13
比如工资表的输出啊。呵呵!
种瓜的(40140203) 10:24:12
这个可不用装IIS一类的东东。方便
成都-兔烧(368242315) 10:24:30
是不是要判断客户端的请求?比如GET某个文件?然后把这个文件发送到客户端?
种瓜的(40140203) 10:24:36
对啊
成都-兔烧(368242315) 10:24:44
怎么发送呢
种瓜的(40140203) 10:24:52
ResponseInfo.ContentText
种瓜的(40140203) 10:25:10
ResponseInfo.ContentStream
种瓜的(40140203) 10:25:28
在那个事件里面设置这两个属性就可以了
种瓜的(40140203) 10:25:42
就是返回给客户的内容
成都-兔烧(368242315) 10:25:42
contenttext是发送文件?
ContentStream 是发送数据流?
种瓜的(40140203) 10:25:46
对
成都-兔烧(368242315) 10:26:07
。。。。。。有什么不同?
种瓜的(40140203) 10:26:09
你可以先将数据库变成html然后发给客户就成了
杭州-Tommy(109292963) 10:26:26
把数据库变成html?
种瓜的(40140203) 10:26:33
一个是流,一个是字符而已
北京-不赖猴(35927925) 10:28:27
是把数据库动态生成HTML文档.
种瓜的(40140203) 10:27:26
看你自己怎么处理了,有很多工具啥,可以把数据导出成HTML,然后以文本的形式打开
成都-兔烧(368242315) 10:27:28
那这里可以用ContentText?
种瓜的(40140203) 10:28:06
ContentText:=HTML文件的内容
种瓜的(40140203) 10:28:23
客户端就会看到这张表了
成都-兔烧(368242315) 10:28:39
如果有图片呢?
杭州-Tommy(109292963) 10:28:49
支持二进制吗?
种瓜的(40140203) 10:29:04
不用二进制,文本的HTML就成
广州-星若清(405409236) 10:29:17
种瓜,问下,文件内容大小有何限制没有?
北京-不赖猴(35927925) 10:31:04
这里跟什么样式没关系,网页是什么,显示就是什么....网页的处理有其他资料.
种瓜的(40140203) 10:29:44
如果超过string的大小 ,你就用流啥。
北京-不赖猴(35927925) 10:31:41
其实你们问的问题都是跟那个控件有关系.性能都依靠那个控件.
种瓜的(40140203) 10:30:16
对。
种瓜的(40140203) 10:32:14
在delphi目录下有一个例子,完整的描述了这个控件的用法,大家可以打开来看
种瓜的(40140203) 10:32:45
在indy/httpserver目录下面