Java Android DataSnap Mobile Connector入门

来自RAD Studio
跳转到:航行,搜索

转到DataSnap Mobile Connectors入门


本主题是开始生成和使用Java Android DataSnap代理,用于Android移动开发。Java代理支持DataSnap本身支持的所有相同数据类型。已经创建了特殊的Java类来包装这些DBX和Delphi类型,它们的用法与Delphi中的用法类似。

当请求时,DataSnap REST服务器生成并分派用于调用服务器上方法的代理类。这与您可能已经熟悉的代理生成非常相似,但也包括压缩代理和所有依赖项,并将此压缩文件发送给请求者的过程。有关此过程的更多信息,请参阅DataSnap Mobile Connectors入门.

DSProxy类和所有运行时文件都包含在com.embarcadero.javaandroid包中,其结构如下:

Javadroidfiles.png文件

注:需要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,它声明包含服务器上定义的所有方法的类。

将文件导入到项目中后,您的设置如下所示:

Android演示文件.png

如何使用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个参数:

  1. DSREST连接,指定服务器连接信息
  2. 包含要注册的服务器通道名称的字符串
  3. 包含管理器ID的字符串(服务器独有)

以下是创建管理器的代码:

DSCallback频道管理器 经理  = 
 新的 DSCallback频道管理器(康纳,“chname”,DSCallback频道管理器.获取新经理ID());

注册和注销回调

以下是注册回调然后广播到其注册所在频道的示例:

经理.寄存器回调(“mycb01”, 新的 我的回叫());

上面的示例注册了一个名为“mycb01”的回调。“registerCallback”方法的第一个参数是回调的ID(该ID对于客户端通道必须是唯一的)。第二个参数是要注册的实际回调实例。如果这是注册的第一个回调,那么当对registerCallback的调用返回时,您不能保证回调管理器已经准备好,因为初始注册是异步完成的。但是,在初始调用registerCallback之后,在注册完成之前,任何后续调用都不会返回。

连接保持打开状态,直到您将其关闭或服务器将其关闭。要停止连接,可以取消注册回调并关闭频道,如下所示:

经理.取消注册回调(“mycb01”);
经理.关闭客户端频道();

另请参见