导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2011/1/7 15:12:31
标题:
DataSnap REST Application开发 [技巧/经验/心得] 征集
浏览:3368
加入我的收藏
楼主:
以前一直用D7,去年无意中去李维的BLOG逛了一次才注意到的.装上XE后,大体上试了试,感觉很不错.在CSDN上基本没有关于这方面的贴子,网上也很少.大都是转李维BLOG上的东西.就个人感觉,DataSnap REST Application是很好的东西. 不管一般的C/S程序还是DELPHI三层,可以更高效,更方便的组织/处理数据. 而且与ASP.NET, FLEX开发的WEB客户端都可以很好的通信.对于喜欢用DELPHI FANS来说,值得研究一下. 下面先说下基础性的东西, DataSnap REST开发大体过程: 数据库读取数据->以JSON格式封装数据->通过HTTP(S)传输数据->接收数据->解析JSON格式数据->DBGRID(EDIT)显示数据 1. 从数据库读取数据. 关键类: TDBXReader, DBXCommand 举例: DBXCmd := SQLConnection1.DBXConnection.CreateCommand; DBXCmd.Text := 'select * from YourTable; DBXReader := DBXCmd.ExecuteQuery; 2. 以JSON格式封装数据: 如果直接返回DBXReader. DELPHI会用JSON格式封装数据. 3. 传输数据 DLL/EXE这两种类型的CGI程序. 熟悉WebBroker的话,可以控制/微调一些行为. 4. 接收数据 DELPHI开发的客户端很容易接收了,ASP.NET等的WEB程序,需要相应的处理. 5. 解析JSON格式数据 不论是DELPHI还是WEB程序,应该都有解析JSON的类. DELPHI是在DBXJSON单元中有相关JSON类. 6. DBGRID(EDIT)显示数据 对于DELPHI开发者来说, 用DB控件还是EDIT,全凭个人喜好. DBXJSONCommon单元中TDBXJSONTools类可以参考. 很容易将READER数据转到CLIENTDATASET中.
----------------------------------------------
学无止境
作者:
2011/1/7 15:12:58
1楼:
2. 以JSON格式封装数据: 如果直接返回DBXReader. DELPHI会用JSON格式封装数据. //---------- 补充一点东西. 直接返回Reader,对于DELPHI开发的客户端来说,处理很方便,如果是ASP.NET等开发的WEB程序,就需要自己去解析了. 当想让DataSnap REST尽快的返回数据时,这样就可以了. 如果不想在WEB端解析, 这时返回的类型最好自定义一下. 拿 FLEX举例, FLEX中的HTTPService的result属性是个*(object)型的. 当赋值给FLEX中的DataGrid.Provider属性时,如果返回的Reader,是无法正常显示. 如果DataSnap REST返回里,返回一个VO项的数组就可以正常显示了.
----------------------------------------------
学无止境
作者:
2011/1/7 15:13:21
2楼:
将WEB页面提交的JSON数据转为自己的VO. 先看代码 //---------- Delphi(Pascal) code procedure TForm1.Button1Click(Sender: TObject); var AVO: TVO; begin AVO := TVO.Create; AVO.XM := '张三'; AVO.NL := 33; AVO.Addr.Addr1 := '北京东城区'; AVO.Addr.Addr2 := '南池子甲1号'; Memo1.Text := TBaseObject.ObjectToJSON<TVO>(AVO).ToString; AVO.Free; end; Memo1.Text内容: {"type":"Unit1.TVO","id":1,"fields":{"XM":"张三","NL":33,"Addr":["北京东城区","南池子甲1号"]}} //---------- 如果想用 TBaseObject.JSONToObject<T>(json: TJSONValue): T; 将JSON数据: {"XM":"张三","NL":33,"Addr":["北京东城区","南池子甲1号"]} 转为自己的TVO对象. 就要拼成Memo1.Text一样的内容. 代码如下: Delphi(Pascal) code procedure TForm1.Button3Click(Sender: TObject); var AJSONObject: TJSONObject; AVO: TVO; begin // 将下面的JSON字符串转为VO // {"XM":"张三","NL":33,"Addr":["北京东城区","南池子甲1号"]}} AJSONObject := TJSONObject.Create; with AJSONObject do begin AddPair('type', 'Unit1.TVO'); AddPair('id', TJSONNumber.Create(1)); AddPair('fields', TJSONObject.ParseJSONValue('{"XM":"张三","NL":33,"Addr":["北京东城区","南池子甲1号"]}')); end; AVO := TBaseObject.JSONToObject<TVO>(AJSONObject); ShowMessage(AVO.XM+':'+IntToStr(AVO.NL)+':'+AVO.Addr.Addr1+AVO.Addr.Addr2); AVO.Free; end; //---------- VO的属性名和JSONPair的名字最好是对应的.但如果像下面这样, VO里多一个XB属性.转换一样会成功. Delphi(Pascal) code TAddr = Record public Addr1: string; Addr2: string; end; TVO = class public XM: string; NL: integer; Addr: TAddr; XB: Boolean; //新加的 end;
----------------------------------------------
学无止境
作者:
2011/1/7 15:14:07
3楼:
TDSHTTPWebDispatcher的几个事件 根据DataSnap REST向导创建的程序, 在TWebModule上有个TDSHTTPWebDispatcher. 它有几个TRESTMethodNameMapXXXX事件. 仅以RESTMethodNameMapGET事件举例,用途是用GetCBA替换原来的GetABC procedure TWebMD.DSHTTPWebDispatcher1RESTMethodNameMapGET(Sender: TObject; const ClassCtx, MethodCtx: string; out DSMethodName: string); begin if MethodCtx='GetABC' then DSMethodName := ClassCtx+'.GetCBA' else DSMethodName := ClassCtx+'.'+MethodCtx; end;
----------------------------------------------
学无止境
作者:
2011/1/7 15:15:19
4楼:
去年11, 12月间,断断续续的研究了一下.印象中只记得这些了. 希望能抛砖引玉.
----------------------------------------------
学无止境
作者:
2011/1/7 15:47:21
5楼:
关注三层,但又盲人摸象中。。。汗 去读完整的英文文档太累了点,实在缺少指南操作或书籍 按现在这个情势,估计也没有人写DELPHI DATASNAP开发指南了。。。
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier 缘在上海
作者:
2011/1/8 6:33:59
6楼:
学习!
----------------------------------------------
这个世界上还有很多比钱更重要的东西,比如说意大利面---加菲猫
作者:
2011/1/10 12:13:46
7楼:
好文啊
----------------------------------------------
-