您的位置:首页 > 编程语言 > Delphi

Delphi Xe DataSnap Rest + Flex 开发 基本探索1

2014-09-04 14:55 483 查看
关于delphi 的datasnap Rest 模式在网上有很多的相关基本文章,大家可以参考,大多数讲的都是 服务器Datasnap +Delphi 客户端的调用方式,

关于这种方式网上资料很多.本系列主要讲讲 服务器 datasnap+rest 和 客户端为 Flex 的开发模式.基本上其他的前端技术如asp.net 等 应该和flex 差别不大.

先说明几个观点:

1 由于delphi Datasnap Rest 模式是一Json的数据格式封装的,所以客户端 只要只是Json格式基本都可以.这样 datasnap 可以说是跨平台了.

2 由于网络上和 datasnap 白皮书 以及一些相关的资料 只介绍了 客户端为 delphi 开发模式,所以本文讲的 Flex 客户端 对于想开发Web 程序的同学很有好处

3 由于也是出于探索阶段,有些问题还不是特别清楚,希望有同样开发需求的同学 多多交流,多多指点

废话少说 下面的开发环境是 delphi xe + Flex 4.0

1.建立Datasnap服务器,记得选择上tcp + http通讯方式 (如何建立datasnap服务器 ,请在网上自己搜索,我就不废话了)



我建立了一个TSMTest 类来发布rest方法 声明的代码如下

TSMTest = class(TDSServerModule)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
dsp: TDataSetProvider;
procedure DSServerModuleCreate(Sender: TObject);
private
stream :Tstream;
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string;id:integer): string;
function SetArr(JsonStr:string):string;
function updateSetBytes(stream:TJSONObject):string;

function GetServerDateTime:string;
function GetInt:integer;
function GetArr:TJSONArray;
function GetDataset:Tdataset;
function GetJsonDataset:TJSONObject;
function GetStream:TStream;
function GetStream2:Tstream;
function GetJsonStream:TJSONArray;
end;


2.在前台flex 先试试最简单的字符串调用



前台的代码

protected function edtstring_clickHandler(event:MouseEvent):void
{
var read :	ReadDataFromServer  = new ReadDataFromServer;
read.onLoadComplete = onStrLoad;
read.Load('datasnap/rest/TSMTest/GetServerDateTime');

}
public function onStrLoad(e:Event):void{
edtstring.text = JSON.decode(e.target.data).result[0];
}


注意 ReadDataFromServer 是本人自己封装的一个http 传输类,也把代码公布出来吧 无私奉献了

package
{
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.utils.ByteArray;
import flash.xml.XMLDocument;

import mx.charts.DateTimeAxis;
import mx.controls.Alert;
import mx.managers.CursorManager;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.http.HTTPService;

//从服务器返回数据

public class ReadDataFromServer
{   public static var RemoateAddress:String = 'http://localhost:8080/';//'/';
public function ReadDataFromServer()
{
}

public var onLoadComplete:Function;

private function onIoError(event:IOErrorEvent):void{
Alert.show("取数据失败!检查网络是否正常!错误:"+event.text);
CursorManager.removeBusyCursor();
}
public function Post(RequestUrl:String,xml:XML):void{
var abs :HTTPService = new HTTPService();
abs.addEventListener(ResultEvent.RESULT,onLoadComplete);
abs.addEventListener(FaultEvent.FAULT,onIoError);
abs.url= ReadDataFromServer.RemoateAddress+ RequestUrl;
abs.method="POST";

abs.resultFormat = HTTPService.RESULT_FORMAT_XML;
abs.contentType="application/xml";
abs.send(xml);

}
public function PostJson(RequestUrl:String,Jsonstr:String):void{
var abs :HTTPService = new HTTPService();
abs.addEventListener(ResultEvent.RESULT,onLoadComplete);
abs.addEventListener(FaultEvent.FAULT,onIoError);
abs.url= ReadDataFromServer.RemoateAddress+ RequestUrl;
abs.method="POST";

abs.resultFormat = HTTPService.RESULT_FORMAT_XML;
abs.contentType="text/xml";
abs.send(Jsonstr);

}
public function PostBytes(RequestUrl:String,bytes:ByteArray):void{
var Loader :URLLoader = new URLLoader();

Loader.dataFormat = URLLoaderDataFormat.TEXT;
if (RequestUrl.indexOf('?')==-1)//没有参数的
RequestUrl = RequestUrl;//+'?LastTime=' +  GvFunc.dateTimeToStr(new Date());
else//有参数的请求
RequestUrl = RequestUrl;// +'&LatTime='+  GvFunc.dateTimeToStr(new Date());
Loader.addEventListener(Event.COMPLETE,onLoadComplete);
var request :URLRequest = new URLRequest(RemoateAddress+ RequestUrl);
request.data = bytes;
request.method =URLRequestMethod.POST;

try {
Loader.load(request);
Loader.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
} catch (e:Error) {
Alert.show("取数据失败!"+e.message);
}

/*
var abs :HTTPService = new HTTPService();
abs.addEventListener(ResultEvent.RESULT,onLoadComplete);
abs.addEventListener(FaultEvent.FAULT,onfaultEvent);
abs.url= ReadDataFromServer.RemoateAddress+ RequestUrl;
abs.method="POST";
// abs.contentType="application/xml";
abs.send(bytes);
*/

}
private function onfaultEvent(event:FaultEvent):void{

Alert.show("取数据失败!检查网络是否正常!错误:"+event.messageId);
CursorManager.removeBusyCursor();
}

public function Load(RequestUrl:String):void{

var Loader :URLLoader = new URLLoader();

Loader.dataFormat = URLLoaderDataFormat.TEXT;
if (RequestUrl.indexOf('?')==-1)//没有参数的
RequestUrl = RequestUrl;//+'?LastTime=' +  GvFunc.dateTimeToStr(new Date());
else//有参数的请求
RequestUrl = RequestUrl ;//+'&LatTime='+  GvFunc.dateTimeToStr(new Date());
Loader.addEventListener(Event.COMPLETE,onLoadComplete);
var decodeurl :String = encodeURI(RequestUrl);
var request :URLRequest = new URLRequest(RemoateAddress+ decodeurl);
//	Alert.show(RemoateAddress+ RequestUrl);
try {
Loader.load(request);
Loader.addEventListener(IOErrorEvent.IO_ERROR,onIoError);
} catch (e:Error) {
Alert.show("取数据失败!"+e.message);
}

}
}
}
这是最基本的flex 调用 delphi datasnap 的rest 服务了..目前来看数据已经通了..对了 里面还有一个JSON 封装类这个 是flex 的一个控件,大家可以在网上下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: