一、实现Rest Datasnap服务端.
Delphi提供了快捷方式,可以很快地建立一个Rest Datasnap服务端。
每一步选择的含义请查看我的另一篇文章 Datasnap初步二
生成的WebModuleUnit1中包含了如下控件:
DSServer1, DSServerClass1 是实现Datasnap服务器功能; DSAuthenticationManager1是为服务器增加登陆验证功能;
DSHTTPWebDispatcher1是实现Datasnap和REST之间的通道。
WebFileDispatcher1是实现REST HTTP服务器的功能。
ServerFunctionInvoker和ReverseString是网页产生控件,用于产生两个样例网页代码.
DSProxyGenerator1和DSServerMetaDataProvider1是用来生成javascript的调用代码,为javascript客户端服务。
这个例子里,我们不采用系统自动生成的样例,而是手动生成一个javascript调用代码。
二、javascript客户端
1. 在ServerMethodsUnit1中加入一个被javascript客户端调用的函数 MyTest. 修改后的ServerMethodsUnit1的代码如下:
unit ServerMethodsUnit1;
interface
uses System.SysUtils, System.Classes, Datasnap.DSServer, Datasnap.DSAuth;
type
{$METHODINFO ON}
TServerMethods1 = class(TComponent)
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
function ReverseString(Value: string): string;
function MyTest(Value: string):string;
end;
{$METHODINFO OFF}
implementation
uses System.StrUtils;
function TServerMethods1.MyTest(Value: string): string;
begin
Result := 'This is a Test:'+Value;
end;
function TServerMethods1.EchoString(Value: string): string;
begin
Result := Value;
end;
function TServerMethods1.ReverseString(Value: string): string;
begin
Result := System.StrUtils.ReverseString(Value);
end;
end.
2. 生成一个MyTest.html文件,在里面加入调用MyTest的javascript代码。
<html>
<head>
<title>DataSnap REST Project</title>
<link rel="stylesheet" type="text/css" href="css/main.css" />
<script type="text/javascript" src="js/base64.js"></script>
<script type="text/javascript" src="js/json2.js"></script>
<script type="text/javascript" src="js/serverfunctionexecutor.js"></script>
<script type="text/javascript" src="js/connection.js"></script>
<script type="text/javascript" src="js/ServerFunctions.js"></script>
<script type="text/javascript">
function serverMethods()
{
return new TServerMethods1(connectionInfo)
}
function onMyTestClick()
{
var valueField = document.getElementById('valueField');
var s = serverMethods().MyTest(valueField.value);
valueField.value = s.result;
}
</script>
</head>
<body>
<div>
<input id="valueField" class="loginField" type="text" value="Test" />
<button onclick='javascript:onMyTestClick();'>MyTest</button>
</div>
</body>
</html>
3. 在WebModuleUnit1中加入一个TPageProducer控件,命名为MyTest, HTMLFile属性设置成MyTest.html文件。
4. 修改WebModuleUnit1的初始化网页代码如下:即服务端的默认网页为MyTest.html网页。
procedure TWebModule1.WebModuleDefaultAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
if (Request.InternalPathInfo = '') or (Request.InternalPathInfo = '/')then
Response.Content := MyTest.Content
else
Response.SendRedirect(Request.InternalScriptName + '/');
end;
至此,javascript客户端代码已经写完。运行程序,启动服务器,打开浏览器.
点击MyTest按钮,调用MyTest函数.
三、总结
1. 在ServerMethodsUnit1中定义服务端要被客户端调用的函数.
2. 按需要生成自定义的javascript客户端文件,放入templates目录下,MyTest.html里是最基本的代码,客户端的网页界面及其他功能都可以在这个基础上扩展。
3. 这样就完成了一个基本的REST服务端和javascript客户端的功能。