DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: wjy13061029975
今日帖子: 4
在线用户: 12
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
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中.
----------------------------------------------
学无止境
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
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项的数组就可以正常显示了.
----------------------------------------------
学无止境
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
学无止境
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
学无止境
作者:
男 jjwwang (jjwwang) ★☆☆☆☆ -
普通会员
2011/1/7 15:15:19
4楼: 去年11, 12月间,断断续续的研究了一下.印象中只记得这些了. 希望能抛砖引玉.
----------------------------------------------
学无止境
作者:
男 luckyrandom (luckyrandom) ★☆☆☆☆ -
普通会员
2011/1/7 15:47:21
5楼: 关注三层,但又盲人摸象中。。。汗
去读完整的英文文档太累了点,实在缺少指南操作或书籍
按现在这个情势,估计也没有人写DELPHI DATASNAP开发指南了。。。
----------------------------------------------
SQL SERVER DBA QQ:315054403 曾经的Delphier  缘在上海
作者:
男 xxhadsg (garfield) ★☆☆☆☆ -
盒子活跃会员
2011/1/8 6:33:59
6楼: 学习!
----------------------------------------------
这个世界上还有很多比钱更重要的东西,比如说意大利面---加菲猫
作者:
男 delphishare (delphishare) ★☆☆☆☆ -
普通会员
2011/1/10 12:13:46
7楼: 好文啊
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行861.3281毫秒 RSS