4.RESTful API(Xamarin.Forms)

★ご注意

以下は、Microsoft Visual Studio Community 2019 の Xamarin.Forms を使用して、Android・iOS・UWP向けクライアントアプリを開発する場合を想定した RESTful API のご説明とサンプルプログラムです。

 

光CTIスマートコネクトサービスは、以下のRESTful APIを提供します。

 

【RESTful API インターフェース仕様  (例.収容回線)】

処理 HTTPメソッド URI
全レコードを取得 GET /CTI_SmartConnectService/RestService/ContainmentLine
1レコードを取得 GET /CTI_SmartConnectService/RestService/ContainmentLine/(回線No)
1レコードを新規登録 POST /CTI_SmartConnectService/RestService/ContainmentLine
1レコードを更新 PUT /CTI_SmartConnectService/RestService/ContainmentLine/(回線No)
1レコードを削除 DELETE /CTI_SmartConnectService/RestService/ContainmentLine/(回線No)

 

【RESTful API 呼出方法】

以下のアドレスにHTTPメソッド(GET、POST、PUT、DELETE)でアクセスすると、データの取得やレコード単位での新規登録・更新・削除を行うことができます。データはJSON形式でやり取り(リクエスト&レスポンス)します。

http://(サービスを実行中のパソコンのIPアドレス):55963/CTI_SmartConnectService/RestService/(URI)

 

◆GETの例

・収容回線の全情報を取得する

GET http://localhost:55963/CTI_SmartConnectService/RestService/ContainmentLine

・回線No.1の情報を取得する

GET http://localhost:55963/CTI_SmartConnectService/RestService/ContainmentLine/1

 

◆POSTの例

・回線の情報を新規登録する

POST http://localhost:55963/CTI_SmartConnectService/RestService/ContainmentLine

 

◆PUTの例

・回線No.2の情報を更新する

PUT http://localhost:55963/CTI_SmartConnectService/RestService/ContainmentLine/2

 

◆DELETEの例

・回線No.3の情報を削除する

DELETE http://localhost:55963/CTI_SmartConnectService/RestService/ContainmentLine/3

 

◆リクエストデータ(JSON形式)の例

{ “回線No” : “1”, “着信TEL” : “0731235678”, “代表TEL” : “0731237777”, “種別” : “電話”, “代理内線番号” : “30” }

 

※POST、PUTする際のリクエストデータのフォーマットは、1レコードGET時のフォーマットと同じです。
(但し、先頭と末尾の中括弧 [ ] は必要ありません。)

※POSTする際のリクエストデータのキー項目(ID、顧客ID、回線Noなど)には 0をセットしてください。
(どのような数値をセットしても自動的に最大番号で新規登録されます。)

※PUTする際のリクエストデータのキー項目(ID、顧客ID、回線Noなど)にどのような数値をセットしても、URI末尾の数字(数値)をキーにして更新されます。

 

◆レスポンスデータ(JSON形式)の例

{ “result” : “True”, “msg” : “正常終了” }

※POST、PUT、DELETE の戻り値は、全てこの形となります。

※GETの戻り値は [{ データ },{ データ }, ・・・] の形です。データが空の時は [ ] です。

 

 

次に、サンプルプログラムの説明をします。

 

【サンプルプログラムの利用方法】

    1. サーバーにするパソコンに「光CTIスマートコネクトサービス」をインストールします。
    2. Microsoft Visual Studio Community 2019 で Xamarin.Formsの新規プロジェクトを作成します。
    3. NuGetパッケージマネージャーで Xamarin.Forms 他を最新の状態に更新しておきます。
    4. UWPプロジェクトの場合は、機能の「インターネット(クライアント)」と「プライベートネットワーク(クライアントとサーバー)」にチェックを付けます。
    5. 以下の【クライアントプログラム(Xamarin.Forms用)のサンプルソース① MainPage.xaml】を参考にプログラムを作成します。
    6. 以下の【クライアントプログラム(Xamarin.Forms用)のサンプルソース② MainPage.xaml.cs】を参考にプログラムを作成します。
    7. 以下の【クライアントプログラム(Xamarin.Forms用)のサンプルソース③ 収容回線.cs】を参考にプログラムを作成します。
    8. 作成したクライアントプログラム(Xamarin.Forms用)をビルド後、実機(Android・iOS・UWP)上で実行します。

 

【使用するポート】

  • 55963ポート(サービス側のパソコンでオープンが必要です。)

 

【クライアントプログラム(Xamarin.Forms用)のサンプルソース① MainPage.xaml】

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="Client_REST_Sample.MainPage">

    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Xamarin.Forms RESTサンプル" 
           HorizontalOptions="Center"
           VerticalOptions="CenterAndExpand" />
        <Button Text="GET" x:Name="Btn_GET" Clicked="Btn_GET_Clicked" />
        <Button Text="POST" x:Name="Btn_POST" Clicked="Btn_POST_Clicked" />
        <Button Text="PUT" x:Name="Btn_PUT" Clicked="Btn_PUT_Clicked" />
        <Button Text="DELETE" x:Name="Btn_DELETE" Clicked="Btn_DELETE_Clicked" />
    </StackLayout>

</ContentPage>

 

【クライアントプログラム(Xamarin.Forms用)のサンプルソース② MainPage.xaml.cs】

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace Client_REST_Sample
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        HttpClient _client;

        public MainPage()
        {
            InitializeComponent();

            _client = new HttpClient();
        }

        private async Task<List<収容回線>> GET_DataAsync()
        {
            var uri = new Uri(string.Format("http://192.168.1.13:55963/CTI_SmartConnectService/RestService/ContainmentLine", string.Empty));
            var response = await _client.GetAsync(uri);
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                var Items = JsonConvert.DeserializeObject<List<収容回線>>(content);
                return Items;
            }
            else
            {
                return null;
            }
        }

        private async Task<bool> POST_DataAsync(収容回線 item, bool isNewItem = false)
        {
            var uri = new Uri(string.Format("http://192.168.1.13:55963/CTI_SmartConnectService/RestService/ContainmentLine", string.Empty));
            var json = JsonConvert.SerializeObject(item);
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            HttpResponseMessage response = null;
            if (isNewItem)
            {
                response = await _client.PostAsync(uri, content);
            }

            if (response.IsSuccessStatusCode)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private async Task<bool> PUT_DataAsync(収容回線 item, bool isNewItem = false)
        {
            var uri = new Uri(string.Format("http://192.168.1.13:55963/CTI_SmartConnectService/RestService/ContainmentLine" + "/" + item.回線No.ToString(), string.Empty));
            var json = JsonConvert.SerializeObject(item);
            var content = new StringContent(json, Encoding.UTF8, "application/json");

            HttpResponseMessage response = null;
            if (isNewItem)
            {
                response = await _client.PutAsync(uri, content);
            }

            if (response.IsSuccessStatusCode)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public async Task<bool> DELETE_DataAsync(long id)
        {
            var uri = new Uri(string.Format("http://192.168.1.13:55963/CTI_SmartConnectService/RestService/ContainmentLine" + "/" + id.ToString(), string.Empty));
            var response = await _client.DeleteAsync(uri);

            if (response.IsSuccessStatusCode)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        private async void Btn_GET_Clicked(object sender, EventArgs e)
        {
            try
            {
                var x = await GET_DataAsync();
                foreach (収容回線 item in x)
                {
                    await DisplayAlert("収容回線",
                        "回線No: " + item.回線No + "\r\n" +
                        "着信TEL: " + item.着信TEL + "\r\n" +
                        "代表TEL: " + item.代表TEL + "\r\n" +
                        "種別: " + item.種別 + "\r\n" +
                        "代理内線番号: " + item.代理内線番号

                        , "OK");
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("エラー", ex.Message, "OK");
            }
        }

        private async void Btn_POST_Clicked(object sender, EventArgs e)
        {
            try
            {
                収容回線 _item = new 収容回線();
                _item.回線No = 0;
                _item.着信TEL = "0731112222";
                _item.代表TEL = "0731111111";
                _item.種別 = "電話";
                _item.代理内線番号 = "3000";

                var x = await POST_DataAsync(_item, true);
                if (x == true)
                {
                    await DisplayAlert("収容回線", "POST出来ました。", "OK");
                }
                else
                {
                    await DisplayAlert("収容回線", "POSTに失敗しました。", "OK");
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("エラー", ex.Message, "OK");
            }
        }

        private async void Btn_PUT_Clicked(object sender, EventArgs e)
        {
            try
            {
                収容回線 _item = new 収容回線();
                _item.回線No = 4;
                _item.着信TEL = "0731113333";
                _item.代表TEL = "0731111111";
                _item.種別 = "電話";
                _item.代理内線番号 = "2000";

                var x = await PUT_DataAsync(_item, true);
                if (x == true)
                {
                    await DisplayAlert("収容回線", "PUT出来ました。", "OK");
                }
                else
                {
                    await DisplayAlert("収容回線", "PUTに失敗しました。", "OK");
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("エラー", ex.Message, "OK");
            }
        }

        private async void Btn_DELETE_Clicked(object sender, EventArgs e)
        {
            try
            {
                var x = await DELETE_DataAsync(4);
                if (x == true)
                {
                    await DisplayAlert("収容回線", "DELETE出来ました。", "OK");
                }
                else
                {
                    await DisplayAlert("収容回線", "DELETEに失敗しました。", "OK");
                }
            }
            catch (Exception ex)
            {
                await DisplayAlert("エラー", ex.Message, "OK");
            }
        }
    }
}

 

【クライアントプログラム(Xamarin.Forms用)のサンプルソース③ 収容回線.cs】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Client_REST_Sample
{
    class 収容回線
    {
        public long 回線No { get; set; }
        public string 着信TEL { get; set; }
        public string 代表TEL { get; set; }
        public string 種別 { get; set; }
        public string 代理内線番号 { get; set; }
    }
}

 

 

【実行画面サンプル】

 

【光CTIスマートコネクトサービスRESTful API仕様】

データ名称 データの要求・応答のタイプ URI
収容回線 データ要求・応答ともにJSON /ContainmentLine

/ContainmentLine/(回線No)

SIPサーバー接続設定 データ要求・応答ともにJSON /SIP-ServerConnection

/SIP-ServerConnection/(ID)

※ID は2以上

接続中クライアント

※GETのみ

データ応答のみJSON /ConnectedClient

/ConnectedClient/(ID)

顧客アドレス帳 データ要求・応答ともにJSON /CustomerAddress

/CustomerAddress/(顧客ID)

着信記録

※GET、PUTのみ

データ要求・応答ともにJSON /ReceivedCall-Record

/ReceivedCall-Record/(ID)

 

※以下は、GETのみ有効

/ReceivedCall-Record/(TOP)/(DESCENDING)/(K_ID)/(FROM)

  • TOP=0 … 全件(全ID)
    TOP=0以外 … 最大表示件数
  • DESCENDING=True(true) … 降順
    DESCENDING=False(false) … 昇順
  • K_ID=0 … 全顧客
    K_ID=0以外 … 特定の顧客IDで抽出
  • FROM=Null … 相手TELを指定しない
    FROM=相手TEL&相手TEL& …  = 相手TELを最大6つまで指定可能(相手TELと相手TELの間の区切りは「&」を挿入する)
着信時URL呼出 データ要求・応答ともにJSON /IncomingCall-URL

/IncomingCall-URL/(ID)

着信時コマンド呼出 データ要求・応答ともにJSON /IncomingCall-Command

/IncomingCall-Command/(ID)

通知先LINEアクセストークン データ要求・応答ともにJSON /Notification-LINE-AccessToken

/Notification-LINE-AccessToken/(ID)

通知先メールアドレス データ要求・応答ともにJSON /Notification-Email-Address

/Notification-Email-Address/(ID)

電話番号検索サイト データ要求・応答ともにJSON /PhoneNumber-SearchSite

/PhoneNumber-SearchSite/(ID)

メッセージ定義_メール用

※GET、POST、PUTのみ

データ要求・応答ともにJSON /MessDef-Mail

/MessDef-Mail/(ID)

メッセージ定義_LINE用

※GET、POST、PUTのみ

データ要求・応答ともにJSON /MessDef-Line

/MessDef-Line/(ID)

メッセージ定義_トースト用

※GET、POST、PUTのみ

データ要求・応答ともにJSON /MessDef-Toast

/MessDef-Toast/(ID)

メールアカウント

※GET、POST、PUTのみ

データ要求・応答ともにJSON /Mail-Account

/Mail-Account/(ID)

オンラインアクティベーション データ要求・応答ともにJSON /Online-Activation

/Online-Activation/(ID)

※ID は2以上

データバックアップ

※GET、POST、PUTのみ

データ要求・応答ともにJSON /DataBackup

/DataBackup/(ID)

ユーザー管理 データ要求・応答ともにJSON /UserManagement

/UserManagement/(ID)

CSVデータ出力

※GET、POST、PUTのみ

データ要求・応答ともにJSON /Output-CSV

/Output-CSV/(ID)

EXCELデータ出力

※GET、POST、PUTのみ

データ要求・応答ともにJSON /Output-EXCEL

/Output-EXCEL/(ID)