REST Datasnap服务端与javascript客户端实现
2016-06-20 12:04
429 查看
一、实现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客户端的功能。
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客户端的功能。
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享