Java Android DataSnap モバイル コネクタ入門
DataSnap モバイル コネクタ入門 への移動
このトピックは、Android モバイル開発用に Java Android DataSnap プロキシを初めて生成して使用するためのガイドです。 Java プロキシでは、DataSnap 自体がサポートしているものと同じデータ型をすべてサポートしています。 DBX や Delphi の型をラップする特別な Java クラスが作成されていて、その使い方は Delphi での使い方とよく似たものになっています。
DataSnap REST サーバーは、要求されると、サーバー上のメソッドを呼び出すためのプロキシ クラスを生成してディスパッチします。 これは、既によくご存知だと思われるプロキシ生成と非常に似ていますが、プロキシとそれに依存するものをすべて zip 圧縮し、その zip ファイルを要求側に送信するという処理も含まれています。 このプロセスについてのさらなる情報については、「DataSnap モバイル コネクタ入門」を参照してください。
DSProxy クラスと実行時ファイルはすべて、com.embarcadero.javaandroid パッケージに含まれています。この構造は次のようになっています。
メモ: Android SDK のバージョン 2.1 が必要です。
目次
DataSnap REST サーバーから Android プロキシ ファイルをダウンロードする方法
まず、Win32ProxyDownloader.exe を入手する必要があります。これは、製品のインストール ディレクトリの \bin
ディレクトリに含まれています。 このファイルとコピーの入手先については、「DataSnap モバイル コネクタ入門」で詳しく説明しています。 このダウンローダは、サーバーとの通信に必要なプロキシなどのファイルをサーバーに要求する際に役立つ単純なユーティリティです。
プロキシ ダウンローダを使用するときには、次のパラメータを指定する必要があります。
- -language(必須): 要求するプロキシのモバイル プラットフォーム/言語を指定します。 Android 開発の場合は java_android と指定します。
- -protocol: 使用する接続プロトコルを指定します。 http または https です。 デフォルトは http です。
- -host: 接続先のポートおよびホスト名または IP アドレスを指定します。 デフォルトは localhost のポート 80 です。 他の名前やポートが必要な場合には、名前は完全修飾名で指定し、コロン(":")で区切ってポート番号まで含める必要があります。
- -output: プロキシ ファイルをダウンロードして保存するフォルダを指定します。 指定しなければカレント フォルダになります。
次の例では、上記のパラメータをほとんど指定しています。
C:\Win32ProxyDownloader.exe -language java_android -host 127.0.0.1:8080 -output C:\test
ダウンローダを実行すると、Android プロキシ ファイルが指定した出力フォルダにコピーされます。 このファイルには次のものが含まれます。
- プロキシで必要となる静的な Java ソース ファイル
- DSProxy.java(生成されたプロキシ)
主なファイルは DSProxy.java で、サーバー上で定義されているすべてのメソッドを含むクラスが宣言されています。
ファイルをプロジェクトにインポートすると、次のようにセットアップされます。
DSProxy クラスの使い方
次のコードは、サーバーで生成された DSProxy.java ファイルです。 コードには TServerMethods1 クラスが含まれていて、そこにサーバー メソッドがカプセル化されています。 このサーバーにはメソッドが 1 つだけあり(EchoString)、Java クラスの TServerMethods1 ではそれに合わせてメソッドを実装しています。 プロキシ ジェネレータによって、サーバーに接続してメソッドを実行するためのすべての Java コードが自動生成されています。
public class DSProxy {
public static class TServerMethods1 extends DSAdmin {
public TServerMethods1(DSRESTConnection Connection) {
super(Connection);
}
private DSRESTParameterMetaData[] TServerMethods1_EchoString_Metadata;
private DSRESTParameterMetaData[] get_TServerMethods1_EchoString_Metadata() {
if (TServerMethods1_EchoString_Metadata == null) {
TServerMethods1_EchoString_Metadata = new DSRESTParameterMetaData[]{
new DSRESTParameterMetaData("Value", DSRESTParamDirection.Input,
DBXDataTypes.WideStringType, "string"),
new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue,
DBXDataTypes.WideStringType, "string"),
};
}
return TServerMethods1_EchoString_Metadata;
}
/**
* @param Value [in] - Type on server: string
* @return result - Type on server: string
*/
public String EchoString(String Value) throws DBXException {
DSRESTCommand cmd = getConnection().CreateCommand();
cmd.setRequestType(DSHTTPRequestType.GET);
cmd.setText("TServerMethods1.EchoString");
cmd.prepare(get_TServerMethods1_EchoString_Metadata());
cmd.getParameter(0).getValue().SetAsString(Value);
getConnection().execute(cmd);
return cmd.getParameter(1).getValue().GetAsString();
}
private DSRESTParameterMetaData[] TServerMethods1_ReverseString_Metadata;
private DSRESTParameterMetaData[] get_TServerMethods1_ReverseString_Metadata() {
if (TServerMethods1_ReverseString_Metadata == null) {
TServerMethods1_ReverseString_Metadata = new DSRESTParameterMetaData[]{
new DSRESTParameterMetaData("Value", DSRESTParamDirection.Input,
DBXDataTypes.WideStringType, "string"),
new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue,
DBXDataTypes.WideStringType, "string"),
};
}
return TServerMethods1_ReverseString_Metadata;
}
}
プロキシ クラスを使用するには、まず、サーバーへの接続を作成してセットアップします。 サーバーに接続するために必要なプロパティやメソッドはすべて、DSRESTConnection クラスにカプセル化されています。 以下に示すように、接続を作成してプロパティをセットアップするだけです(Java コード)。
import com.embarcadero.javaandroid.DSRESTConnection;
// ...
DSRESTConnection conn = new DSRESTConnection();
conn.setHost("host");
conn.setPort(port);
conn.setProtocol("http");
- host プロパティはホスト名または IP アドレスです。
- port プロパティはサーバーがリスンしているポートです。
- protocol プロパティは接続に使用するプロトコルです。 具体的には、 http か https のどちらかです。
サーバー メソッドをリモートで呼び出すには、接続を渡してプロキシ クラスを作成し、それからメソッドを呼び出すだけです(Java コード)。
DSRESTConnection conn = new DSRESTConnection();
conn.setHost("10.40.30.24");
conn.setPort(8080);
TServerMethods1 proxy = new TServerMethods1(conn);
String Result = proxy.EchoString("Hello, World!");
var パラメータを持つサーバー メソッドの例
次の例では、サーバー メソッドが var
パラメータを含むか複数の結果を返す場合に生成されるコードを取り上げます。
サーバー メソッドの Delphi コードは次のようになっています。
function TServerMethods1.VarParamTest(var Value: string): string;
begin
Value := StrUtils.ReverseString(Value);
Result := Value;
end;
そして次に示すのが、そのサーバー メソッドを呼び出すための生成されたプロキシ コードです。
private DSRESTParameterMetaData[] TServerMethods1_VarParamTest_Metadata;
private DSRESTParameterMetaData[] get_TServerMethods1_VarParamTest_Metadata() {
if (TServerMethods1_VarParamTest_Metadata == null) {
TServerMethods1_VarParamTest_Metadata = new DSRESTParameterMetaData[]{
new DSRESTParameterMetaData("Value", DSRESTParamDirection.InputOutput,
DBXDataTypes.WideStringType, "string"),
new DSRESTParameterMetaData("", DSRESTParamDirection.ReturnValue,
DBXDataTypes.WideStringType, "string"),
};
}
return TServerMethods1_VarParamTest_Metadata;
}
/**
* @param Value [in/out] - Type on server: string
* @return result - Type on server: string
*/
public static class VarParamTestReturns {
public String Value;
public String returnValue;
}
public VarParamTestReturns VarParamTest(String Value) throws DBXException {
DSRESTCommand cmd = getConnection().CreateCommand();
cmd.setRequestType(DSHTTPRequestType.GET);
cmd.setText("TServerMethods1.VarParamTest");
cmd.prepare(get_TServerMethods1_VarParamTest_Metadata());
cmd.getParameter(0).getValue().SetAsString(Value);
getConnection().execute(cmd);
VarParamTestReturns ret = new VarParamTestReturns();
ret.Value = cmd.getParameter(0).getValue().GetAsString();
ret.returnValue = cmd.getParameter(1).getValue().GetAsString();
return ret;
}
メソッドが VarParamTestReturns のインスタンスを返すことに注目してください。 この特別なクラスは、結果の他に、var
(in/out)パラメータについての情報も保持します。
次の例では、メソッドを呼び出し、結果の値を読み取る方法を示しています。
TServerMethods1 proxy = new TServerMethods1(conn);
VarParamTestReturns Result = proxy.VarParamTest("Hello, World!");
System.out.println(Result.Value);
System.out.println(Result.returnValue);
渡したパラメータの新しい値と結果の値は、両方とも Result インスタンスに保持されます。 Result.Value の値は "!dlroW ,olleH"、Result.returnValue は "Hello, World!" になります。
重量コールバックの使い方
重量コールバックは、DataSnap サーバーから REST クライアントへ、ほぼ即座に通知を送るための方法です。 クライアントは興味のあるサーバー上の特定のトピックにコールバックを登録することができ、そうすると、そのトピックが更新されるたびにクライアントは通知を受け取ることになります。 もちろんこれは重量コールバックが行う処理をきわめて単純化した説明ですが、ここでの作業には十分です。
アプリケーションでコールバックを使用するには、まず、抽象クラス DBXCallback を継承したカスタム コールバック クラスを作成し、抽象メソッド "Execute" をオーバーライドします。 このクラスの実装例を次に示します。
public class MyCallback extends DBXCallback {
public TJSONValue execute(TJSONArray params) {
System.out.println(params.toString());
return new TJSONTrue();
}
}
DSClientCallbackChannelManager クラスはクライアントのコールバックを管理するためのものです。 コールバックを登録および登録解除するためのメソッドや、その 1 つまたはすべてを閉じるためのメソッドを提供しています。 コンストラクタは次の 3 つのパラメータを受け取ります。
- DSRESTConnection。サーバー接続情報を指定します
- 登録するサーバー チャネルの名前を含む文字列
- マネージャの ID(サーバーから見て一意)を含む文字列
以下はこのマネージャを作成するコードです。
DSCallbackChannelManager manager =
new DSCallbackChannelManager(conn,"chname",DSCallbackChannelManager.getNewManagerID());
コールバックの登録と登録解除
次に示すのは、コールバックを登録し、登録した同じチャネルにブロードキャストを行う例です。
manager.registercallback("mycb01", new MyCallback());
上記の例では "mycb01" という名前でコールバックを登録しています。 'registerCallback' メソッドの最初のパラメータはコールバックの ID です(この ID はクライアント チャネルから見て一意でなければなりません)。 2 番目のパラメータは、登録される実際のコールバック インスタンスです。 これが登録される最初のコールバックであれば、registerCallback の呼び出し結果が返されたときに、コールバック マネージャの準備が整っているという保証はありません。初期登録は非同期で行われるためです。 ただし、registerCallback の最初の呼び出しが済めば、その後の呼び出しは登録が完了するまで返されることはありません。
接続は、アプリケーションで切断するかサーバーから切断されるまでは、開いたままになります。 接続を切断するには、次のように、コールバックの登録を解除してチャネルを閉じます。
manager.unregisterCallback("mycb01");
manager.closeClientChannel();