Delphi10 AndroidでSoapクライアント

#はじめに
Delphi 10.3.3 Community Edition を入手したのでモバイルアプリを作ってみたいと思います。
まずはSoapクライアントができるのか試してみました。（Restはまだお勉強中）
SoapができればDB接続などのめんどくさい動作は全部サーバー側に持たせることができるので
作りなれないモバイルアプリでも色々出来るのではと期待しています。
AndroidでもIOSでも同じことができると思いますが、現状は手元にMacが無いので
手持ちのAndroid機で試してみることにしました。（それも超古いやつですが…）
作り方は基本Windowsアプリと同じです。FireMonkeyの本領発揮ですね。


#評価環境
開発マシン： Windows10 professional (Core i5-3337U 1.8GHzで重いですT_T)
Delphi   ： Delphi 10.3.3 Community Edition
Androidマシン：Nexus7 (32bit)
Androidバージョン：6.0.1

#Android側の準備
開発マシンとNexus7をUSBケーブルでつなぐ
設定-開発者向けオプションで
　・USBデバッグモードをONにする
　・スリープモードにしないをONにする

#Soapサービスの準備
Tomcat+Axis2 でテスト用に簡単なSoapサービスを作成します。

```Java
package main;
import java.util.Date;
public class Demo {
	//固定文字列を返す
	public String Rev(){
		return "Rev1.00";
	}
	//2値の足し算の結果を返す
	public int Plus(int a,int b){
		return a + b;
	}
	//2値の引き算の結果を返す
	public int Minus(int a,int b){
		return a - b;
	}
	//現在の日付時刻を返す
	public String DateTime(){
		return new Date().toString();
	}
}
```
ブラウザでSoapサービスの動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/d6763e93-12d6-f782-5dd0-6d493b0484f5.png)

#Delphiでプログラム作成
新規作成-マルチデバイスアプリケーション　でプロジェクト作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/ea118819-20f6-77e8-3377-17263b6b6967.png)
空のアプリケーションを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/72aa8d53-3430-e70b-0ca6-0f7bf6a43796.png)

ファイル-新規作成-その他-Delphiプロジェクト-Web からWSDLインポータを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/812e5dab-7020-d14b-5912-e3d072722712.png)
WSDLソースにSoapサービスのWSDLのURLを指定して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/378f1a0d-b349-efd4-881a-d6af0427069f.png)
SOAPバージョンの自動選択を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/124eef53-d24c-c0d7-926c-d191f39d8849.png)
既定値のまま次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/6d651541-7bb8-6ce1-f347-989a2a256242.png)
定義用ソースが自動生成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/4ec9f157-6ab2-e60e-9137-fdab1766d3fe.png)
この関数名（ここではGetDemoPortType）を使うのでメモっておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/84f33c3f-2aaf-edc6-a27b-afd75a07df45.png)
ターゲットプラットフォームにUSB接続したデバイスが認識されているのを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/21a49821-2747-c03c-f278-9b84fcae69e4.png)
・ターゲットをAndroid32ビット Nexus7 ビュー Android7インチタブレットに変更
・画面に各関数呼び出し用のTButton、足し算、引き算用の値入力用TEditを配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/cdb468da-3680-3410-2458-26b4d98f3108.png)

uses句に自動生成されたソース名を追加

```Pascal
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Edit,
  FMX.Controls.Presentation, FMX.StdCtrls, Demo;
```

各ボタンのイベントハンドラに呼び出し内容を記述
xxx.xxx.xxx.xxx は実際に接続するSoapサーバーのIPまたはホスト名を指定
  httpsでも動きました。

```Pascal
// 起動時に入力ボックスクリア
procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Text := '';
  Edit2.Text := '';
end;

// Revボタン
procedure TForm1.Button1Click(Sender: TObject);
var SoapObject : DemoPorttype;
begin
  SoapObject := GetDemoPortType(false,'http://xxx.xxx.xxx.xxx:8080/SoapDemo/services/Demo?wsdl');
  ShowMessage(SoapObject.Rev);
end;

// DateTimeボタン
procedure TForm1.Button2Click(Sender: TObject);
var SoapObject : DemoPorttype;
begin
  SoapObject := GetDemoPortType(false,'http://xxx.xxx.xxx.xxx:8080/SoapDemo/services/Demo?wsdl');
  ShowMessage(SoapObject.DateTime);
end;

// Plusボタン
procedure TForm1.Button3Click(Sender: TObject);
var SoapObject : DemoPorttype;
    a,b,y : integer;
begin
  SoapObject := GetDemoPortType(false,'http://xxx.xxx.xxx.xxx:8080/SoapDemo/services/Demo?wsdl');
  a := StrToInt(Edit1.Text);
  b := StrToInt(Edit2.Text);
  y := SoapObject.Plus(a,b);
  ShowMessage(format('%d+%d=%d',[a,b,y]));
end;

// Minusボタン
procedure TForm1.Button4Click(Sender: TObject);
var SoapObject : DemoPorttype;
    a,b,y : integer;
begin
  SoapObject := GetDemoPortType(false,'http://xxx.xxx.xxx.xxx:8080/SoapDemo/services/Demo?wsdl');
  a := StrToInt(Edit1.Text);
  b := StrToInt(Edit2.Text);
  y := SoapObject.Minus(a,b);
  ShowMessage(format('%d-%d=%d',[a,b,y]));
end;
```

#実行
プロジェクト、ソースに名前を付けて保存します。
実行を行うとコンパイル後にAndroid側でアプリが起動します。
コンパイル時間はWindowsアプリに比べると長いです。（私のマシンで1分くらい）

Androidで起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/d9326556-2970-d8ac-d77d-8c9650b7ae0b.png)
DateTimeボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/63edf001-b911-a7fe-3286-c7247b802fb1.png)
Minusボタンクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625152/87d404b1-6547-d8b7-68a9-dc43663c10c1.png)

無事に動きましたとさ。　めでたし　めでたし
Macが入手出来たらIOSでもやってみたいと思います。