转到DataSnap Mobile Connectors入门
本主题是开始生成和使用Java Android DataSnap代理,用于Android移动开发。Java代理支持DataSnap本身支持的所有相同数据类型。已经创建了特殊的Java类来包装这些DBX和Delphi类型,它们的用法与Delphi中的用法类似。
当请求时,DataSnap REST服务器生成并分派用于调用服务器上方法的代理类。这与您可能已经熟悉的代理生成非常相似,但也包括压缩代理和所有依赖项,并将此压缩文件发送给请求者的过程。有关此过程的更多信息,请参阅DataSnap Mobile Connectors入门.
DSProxy类和所有运行时文件都包含在com.embarcadero.javaandroid包中,其结构如下:
注:需要Android SDK 2.1版。
如何从DataSnap REST服务器下载Android代理文件
首先,您需要获得Win32ProxyDownloader.exe,在中提供\垃圾桶
产品安装目录。此文件以及从何处获取副本将在中进一步讨论DataSnap Mobile Connectors入门下载程序是一个简单的实用程序,可以帮助向服务器请求代理和与服务器通信所需的其他文件。
要使用代理下载程序,您需要提供以下参数:
- -语言(必填):指定所请求代理的移动平台/语言。对于Android开发,请使用java_安卓.
- -协议:指定要使用的连接协议:http或https。默认为http。
- -主持人:指定要连接的端口和主机名或IP地址。默认值为端口为80的本地主机。如果需要不同的名称或端口,则必须使用包含端口号的完全限定名称,并用冒号(“:”)分隔。
- -输出:指定要将代理文件下载到的文件夹。如果未指定,则使用当前文件夹。
以下示例使用了上述大多数参数:
C: \Win32ProxyDownloader.exe-语言java_android-主机127.0.0.1:8080-输出C:\test
执行下载程序后,Android代理文件被复制到指定的输出文件夹中。这些文件包括以下内容:
- 代理所需的静态Java源文件
- DSProxy.java,生成的代理
主文件是DS代理.java,它声明包含服务器上定义的所有方法的类。
将文件导入到项目中后,您的设置如下所示:
如何使用DSProxy类
下面的代码显示了DSP代理.java服务器生成的文件。该代码包含一个TServerMethods1类,该类封装了服务器方法。我们的服务器只有一种方法(回声字符串),Java类TServerMethods1相应地实现了它。代理生成器已自动生成用于连接到服务器和执行方法的所有Java代码:
公众的 班 DS代理 {
公众的 静止的 班 T服务器方法1 延伸 DSAdmin公司 {
公众的 T服务器方法1(DSREST连接 连接) {
超级的(连接);
}
私有的 DSREST参数元数据[] T服务器方法1_EchoString_元数据;
私有的 DSREST参数元数据[] 获取服务器方法1_EchoString_元数据() {
如果 (T服务器方法1_EchoString_元数据 == 无效的) {
T服务器方法1_EchoString_元数据 = 新的 DSREST参数元数据[]{
新的 DSREST参数元数据(“价值”, DSREST参数方向.输入,
DBX数据类型.宽字符串类型, “字符串”),
新的 DSREST参数元数据("", DSREST参数方向.返回值,
DBX数据类型.宽字符串类型, “字符串”),
};
}
返回 T服务器方法1_EchoString_元数据;
}
/**
*@param Value[in]-在服务器上键入:string
*@return result-在服务器上键入:string
*/
公众的 字符串 回声字符串(字符串 价值) 投掷 DBX异常 {
DSREST命令 命令 = 获取连接().创建命令();
命令.设置请求类型(DSHTTP请求类型.GET(获取));
命令.设置文本(“TServerMethods1.EchoString”);
命令.准备(获取服务器方法1_EchoString_元数据());
命令.getParameter(获取参数)(0).获取价值().设置为字符串(价值);
获取连接().执行(命令);
返回 命令.getParameter(获取参数)(1).获取价值().获取字符串();
}
私有的 DSREST参数元数据[] TServerMethods1_ReverseString_元数据;
私有的 DSREST参数元数据[] 获取服务器方法1_ReverseString_元数据() {
如果 (TServerMethods1_ReverseString_元数据 == 无效的) {
TServerMethods1_ReverseString_元数据 = 新的 DSREST参数元数据[]{
新的 DSREST参数元数据(“价值”, DSREST参数方向.输入,
DBX数据类型.宽字符串类型, “字符串”),
新的 DSREST参数元数据("", DSREST参数方向.返回值,
数据库数据类型.宽字符串类型, “字符串”),
};
}
返回 TServerMethods1_反向字符串_元数据;
}
}
使用代理类的第一步是创建和设置到服务器的连接。等级DSREST连接封装了连接到服务器所需的所有属性和方法。只需创建连接并设置如下所示的属性(Java代码):
进口 com.embarcadero.javaandroid。DSREST连接;
// ...
DSREST连接 康纳 = 新的 DSREST连接();
康纳.setHost(设置主机)(“主机”);
康纳.设置端口(港口);
康纳.set协议(“http”);
- 这个主办属性是主机名或IP地址。
- 这个港口属性是服务器正在侦听的端口。
- 这个协议属性是用于连接的协议。具体来说:http或https。
要远程调用服务器方法,只需创建代理类,传递连接,然后调用该方法(Java代码):
DSREST连接 康纳 = 新的 DSREST连接();
康纳.setHost(设置主机)("10.40.30.24");
康纳.设置端口(8080);
T服务器方法1 代理 = 新的 T服务器方法1(康纳);
字符串 结果 = 代理.回声字符串(“你好,世界!”);
带有var参数的服务器方法示例
下面的示例说明了当服务器方法包含无功功率,无功功率
参数或返回多个结果。
这是服务器方法的Delphi代码:
功能 T服务器方法1.变量参数测试(无功功率,无功功率 价值: 一串): 一串;
开始
价值 := 结构实用程序.反转字符串(价值);
结果 := 价值;
结束;
下面是生成的用于调用该服务器方法的代理代码:
私有的 DSREST参数元数据[] TServerMethods1_VarParam测试元数据;
私有的 DSREST参数元数据[] 获取服务器方法_参数测试_元数据() {
如果 (TServerMethods1_VarParam测试元数据 == 无效的) {
TServerMethods1_VarParam测试元数据 = 新的 DSREST参数元数据[]{
新的 DSREST参数元数据(“价值”, DSREST参数方向.输入输出,
DBX数据类型.宽字符串类型, “字符串”),
新的 DSREST参数元数据("", DSREST参数方向.返回值,
DBX数据类型.宽字符串类型, “字符串”),
};
}
返回 TServerMethods1_VarParam测试元数据;
}
/**
*@param Value[in/out]-在服务器上键入:string
*@return result-在服务器上键入:string
*/
公众的 静止的 班 VarParamTest返回 {
公众的 字符串 价值;
公众的 字符串 returnValue(返回值);
}
公众的 VarParamTest返回 变量参数测试(字符串 价值) 投掷 DBX异常 {
DSREST命令 命令 = 获取连接().创建命令();
命令.设置请求类型(DSHTTP请求类型.GET(获取));
命令.设置文本(“TServerMethods1.VarParamTest”);
命令.准备(获取服务器方法_参数测试_元数据());
命令.getParameter(获取参数)(0).获取价值().设置为字符串(价值);
获取连接().执行(命令);
VarParamTest返回 ret(雷特) = 新的 VarParamTest返回();
ret(雷特).价值 = 命令.getParameter(获取参数)(0).获取价值().获取字符串();
ret(雷特).returnValue(返回值) = 命令.getParameter(获取参数)(1).获取价值().获取字符串();
返回 ret(雷特);
}
请注意,该方法返回VarParamTestReturns的实例。这个特殊类包含以下信息无功功率,无功功率
(输入/输出)参数以及结果。
下面的示例显示了如何调用该方法并读取结果值:
T服务器方法1 代理 = 新的 T服务器方法1(康纳);
VarParamTest返回 结果 = 代理.VarParam测试(“你好,世界!”);
系统.外面的.打印ln(结果.价值);
系统.外面的.打印ln(结果.returnValue(返回值));
传入参数的新值和结果值都由结果例如。的值结果。价值是“!dlroW,olleH”,并且结果返回值是“你好,世界!”。
如何使用重量级回调
重量级回调为DataSnap Server提供了一种向REST客户端发送几乎即时通知的方法。客户机可以在感兴趣的服务器上注册特定主题的回调,然后每当更新该主题时,客户机都会收到通知。当然,这是对重量级回调所完成任务的一个非常简单的描述,但对于本任务的目的来说已经足够了。
在应用程序中使用回调的第一步是创建从抽象DBXCallback类继承的自定义回调类,并覆盖抽象的“Execute”方法。此类的示例实现如下所示:
公众的 班 我的回叫 延伸 DBX回调 {
公众的 TJSON值 执行(TJSONArray(TJSON数组) 参数) {
系统.外面的.打印ln(参数.toString(字符串)());
返回 新的 TJSON真();
}
}
这个DSClientCallback频道管理器类管理客户端的回调。它提供了注册和注销回调以及关闭其中一个或全部回调的方法。其构造函数接受3个参数:
- DSREST连接,指定服务器连接信息
- 包含要注册的服务器通道名称的字符串
- 包含管理器ID的字符串(服务器独有)
以下是创建管理器的代码:
DSCallback频道管理器 经理 =
新的 DSCallback频道管理器(康纳,“chname”,DSCallback频道管理器.获取新经理ID());
注册和注销回调
以下是注册回调然后广播到其注册所在频道的示例:
经理.寄存器回调(“mycb01”, 新的 我的回叫());
上面的示例注册了一个名为“mycb01”的回调。“registerCallback”方法的第一个参数是回调的ID(该ID对于客户端通道必须是唯一的)。第二个参数是要注册的实际回调实例。如果这是注册的第一个回调,那么当对registerCallback的调用返回时,您不能保证回调管理器已经准备好,因为初始注册是异步完成的。但是,在初始调用registerCallback之后,在注册完成之前,任何后续调用都不会返回。
连接保持打开状态,直到您将其关闭或服务器将其关闭。要停止连接,可以取消注册回调并关闭频道,如下所示:
经理.取消注册回调(“mycb01”);
经理.关闭客户端频道();
另请参见