3
2

More than 3 years have passed since last update.

Delphi10 AndroidでSoapクライアント

Last updated at Posted at 2020-04-24

はじめに

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サービスを作成します。

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

Delphiでプログラム作成

新規作成-マルチデバイスアプリケーション でプロジェクト作成
image.png
空のアプリケーションを選択
image.png

ファイル-新規作成-その他-Delphiプロジェクト-Web からWSDLインポータを起動
image.png
WSDLソースにSoapサービスのWSDLのURLを指定して次へ
image.png
SOAPバージョンの自動選択を選択して次へ
image.png
既定値のまま次へ
image.png
定義用ソースが自動生成される
image.png
この関数名(ここではGetDemoPortType)を使うのでメモっておく
image.png
ターゲットプラットフォームにUSB接続したデバイスが認識されているのを確認
image.png
・ターゲットをAndroid32ビット Nexus7 ビュー Android7インチタブレットに変更
・画面に各関数呼び出し用のTButton、足し算、引き算用の値入力用TEditを配置
image.png

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

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でも動きました。

// 起動時に入力ボックスクリア
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
DateTimeボタンクリック
image.png
Minusボタンクリック
image.png

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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2