【Delphi Sample】Delphi と Google App Engine と Thrift と Java その3

【Delphi Sample】Delphi と Google App Engine と Thrift と Java その3

Google App Engine(GAE/J)Delphi間をApache Thriftを使って通信するサンプルの第3回目です。今回はクライアント側の実装を進めます。

クライアントアプリケーション

クライアントはDelphiで作成します(Delphi 10.2 Community Editionを利用しています)

フォルダ構成

コマンドで出力したファイルをフォルダのままプロジェクトに追加します。フォルダを変更したいときは、IDLnamespaceを編集して、再度ファイルを自動生成してください。
「Thrift」フォルダはThriftライブラリです。Apache ThriftのGitHubリポジトリからダウンロードすることができます。こちらもunit名にThriftとついていますから、Thriftフォルダに入れるとよいでしょう。

コーディング

今回は四則演算のうち、足し算の処理を呼び出してみます。

MainForm.fmx

足し算のインターフェイスはパラメータを二つ取り、整数値が戻ってくるという単純な形なので、

i32 add(1:i32 param1, 2:i32 param2)

画面にも同じようにパラメータ用と戻り値用のEditを配置します。処理を呼び出すトリガーとしてButtonも配置しておきます。Buttonを押すとパラメータの1と2をサーバーに送り、答えを返してもらうというわけです。

MainForm.pas

ポイントとなるのは次のことくらいでしょうか?

  • usesにThriftのライブラリを追加
  • HTTPを利用して通信するため、THTTPClientImplを利用
  • ServletにマッピングしたURLをTransportに与える
  • 利用後はCloseを忘れないこと
unit MainForm;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Edit, FMX.Controls.Presentation, 
  Thrift, Thrift.Transport, Thrift.Protocol,
  ThriftInterface.Calculator;

type
  TfrmMain = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private 宣言 }
  public
    { public 宣言 }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.fmx}

procedure TfrmMain.Button1Click(Sender: TObject);
var
  transport: ITransport;
  protocol: IProtocol;
  client: TCalculatorService.Iface;
  p1, p2, answer: integer;
begin
  try
    transport := THTTPClientImpl.Create('http://localhost:8080/calculator');
    protocol := TBinaryProtocolImpl.Create(transport);
    client := TCalculatorService.TClient.Create(protocol);

    p1 := StrToInt(Edit1.Text);
    p2 := StrToInt(Edit2.Text);

    transport.Open;
    answer := client.add(p1, p2);
    transport.Close;

    Edit3.Text := IntToStr(answer);

  except
    on e: Exception do
      WriteLn(e.ClassName + ': ' + e.Message);
  end;
end;

end.

サーバー側のサービスが増えるたびに(=URLのマッピングが増える)Transportを作成するときのURLが変わるので、この辺りは抽象化できるポイントだと思います。

動作確認

最後に動作確認です。

まずは、サーバー側1を起動しておきます(ポート番号がDelphiで指定したURLと同じ番号で立ち上がっていることを確認してください)。

次にDelphi側でアプリケーションを実行し、パラメータ1とパラメータ2に適当な数値を入力し、ボタンを押してください。すると、答えに結果が表示されます。

サーバーと通信している最中は処理がブロッキングされますので、注意してください。

スポンサーリンク


  1. 今回はGoogle App Engineを利用しているので、もちろんApp Engineにデプロイしたアプリでも構いません。その場合はURLを適切に変更してください。SSLも利用できます。 ↩︎

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成