この記事は、Yılmaz Yörü氏のブログの抄訳です
為替レートは、株式相場や暗号通貨のデータセットと同様に、興味深い金融データセットです。為替ビジネスのためのソフトウェアやPOSシステムなどのソリューションを構築するためには必要なデータセットであり、このデータに簡単にアクセスできるAPIがオンラインで提供されています。利用可能なAPIの1つは、apilayer(詳細はこちらを参照)が提供するExchangeRatesAPI.ioです。
このAPIは、Windows、Android、iOS、macOS、Linux向けのRAD StudioやDelphiを利用して、単一のコードベース、単一のUIでクロスプラットフォームの為替レートソリューションを簡単に構築できるため、とても使いやすいです。
このブログでは、DelphiとC++Builderで利用可能なRESTコンポーネントを使用して、ExchangeRates APIにアクセスし、為替レートを取得するアプリケーションの作成をチューリアル形式で基本から学べます。またExchangeRates APIを利用するためには、事前準備も必要なため、そちらも含めて解説いたします。
ExchangeRates APIについて
Exchangerates APIは、15を超える為替レートデータソースを使用して、170を超える世界通貨の為替レートデータをライブで配信しています。複数のエンドポイントがあり、それぞれが異なる目的、ユースケースを提供します。 これらのエンドポイントには、特定のセットまたはすべての通貨の最新の為替レート情報を受信するなどの機能があります。 ある通貨から別の通貨への変換、 複数または1つの通貨の時系列データの受信、および変動データのためのAPIの日次保存などの機能を持っています。
Exchangerates APIへアクセスするためには、事前にアカウントを作成する必要があります。アカウントを作成するには、以下の通りです。
ExchangeRatesAPI.ioのサイトにアクセスし、[SIGN UP FREE]をクリックします。
ExchangeRatesAPIには、いくつかのサブスクリプションのプランが設けられており、無償プランからビジネス向けの有償プランまで、4種類のサービスが提供されております。
サブスクリプションプランによって利用可能なサービスに違いがあります。(利用できるサービス内容は、上図を参照)
選択するプランによって、リクエスト数、利用できるAPIのエンドポイントの種類、など異なる機能を提供しています。なお、Basic以上のサブスクリプションの有償プランでは256ビットSSL 暗号化をサポートしており、APIにHTTPS接続が利用できますが、無償プランはサポートしてないためHTTP接続のみ利用可能です。
このブログでは、無償プランでアカウントを作成し、話を進めていきます。
無償のプランの[SIGN UP]を選択し、ユーザー情報を入力することでアカウントが作成できます。アカウントの作成が完了すると、API アクセスキーが発行されます。下図は発行されたAPI アクセスキーの例です。
「API Access Key」は、ExchangeratesAPIへURLパラメータ(access_key)として渡す一意の識別キーです。
access_keyを含むパラメータは、ExchangeratesAPIを使用した一意の識別認証として機能します。そのためExchangeratesAPIにアクセスする際はAPI Access Keyが必要となります。
詳しい使い方はこの後で説明いたします。
その前にRESTについて、簡単におさらいをしましょう。
RESTについて
REST(Representational State Transfer)は、Webサービスを利用したインタラクティブなアプリケーションを作成するために、データの取得や投稿を可能にする接続方法です。RESTは、HTTPのサブセットを使用します。このRESTデータ転送アーキテクチャを使用したWebサービスは、RESTfulと呼ばれます。このWebサービスは、Webリソースをテキスト形式で提供する必要があります。また、このサービスでは、ステートレスプロトコルと事前定義された一連の操作を使用して、コンテンツを読み取ったり変更したりできます。 RESTは、これらのサービスを提供するインターネット上のコンピューターシステム間の相互運用性を可能にする新しい最新のデータ転送アーキテクチャです。
RESTは、最新のデータ転送アーキテクチャであり、これらのサービスを提供するインターネット上のコンピュータシステム間の相互運用を可能にします。RESTはBackend as a Service (BaaS)であり、RESTサーバーまたはRESTクライアントアプリケーションで使用することができ、WebサービスにアクセスするためのSOAPの代替となります。
RAD Studioでは、RESTベースのWebサービスにアクセスするためのRESTクライアントライブラリをクロスプラットフォームで使用することができます(但し、DelphiとC++Builderは、サポートしているターゲットプラットホームに違いがあるのでご注意ください) 。RESTライブラリフレームワークは、表現形式としてJSONに焦点を当てています。 XMLは明示的にサポートされていません。
RAD StudioにはTCP/IP接続以外にも、FireDACによるInterBase、IB Express、MSSQL、MySQL、PostgreSQL、SQLite等へのSQL接続など、さまざまな接続オプションが用意されています。そしてRAD Studioで標準提供しているRESTコンポーネントを使用してREST接続を行うことができる、クライアントまたはサーバーとしてのRESTベースの接続機能もあります。
RESTデバッガ
RAD Studioでは、RESTデバッガツール(RESTDebugger.exe)を提供しており、
そのツールを使用して、コンポーネントを簡単にセットアップできます。
RESTデバッガツールは、$(BDS)¥binフォルダ内に配置されているRESTDebugger.exeという実行ファイルをダブルクリックするか、RADStudioのIDEメニューの[ツール] > [RESTデバッガ]を選択すると起動できます。(下図は起動したRESTデバッガの画面)
Embarcadero RESTデバッガ(最新バージョンは10.4.2)を使用すると、開発者はRESTful Webサービスがどのように動作するかを探索、テストできるため、最終的にその理解を深めることに役立てられます。フィルタリング可能なJSON blob、合理化されたOAuth 1.0/2.0認証、設定可能なリクエスト/リソースパラメータを使用して、RESTデータに直接アクセスできます。さらにRESTデバッガの[コンポーネントのコピー]によってRADStudioのフォームへRESTコンポーネントを直接コピーして貼り付けることができます。 これにより、数回クリックするだけで、DelphiまたはC++BuilderアプリでのRESTサービスの構成と利用が可能になります。
RESTデバッガは、他のRESTツールで使用可能な無償版も提供していており、こちらからダウンロードできます。
それでは、実際にExchangeRates APIにアクセスしてみましょう。
ExchangeRates APIの設定
Exchangerates APIを利用するには非常にシンプルで、以下の手順の通りです。
(1) Exchangerates APIへのサインアップは、exchangeratesapi.ioから登録できます。プランを選択できますが、詳しくは上述した「Exchangerates APIについて」の項目を参照ください。ここでは無償プランでアカウントを作成します。
(2)アカウントを作成後、https://manage.exchangeratesapi.io/dashboardからAPI Access Keyを取得します。
API Access Keyは、ユーザーごとに異なりますので、自身のアカウントのAccess Keyをご利用ください。
以下は、ExchangeratesAPIにアクセスするURLフォーマットの例です。
http://api.exchangeratesapi.io/v1/(エンドポイント名)?access_key=(あなたのアクセスキー)
なお、Exchangerates APIに登録された方のリンク例は、3-Step QuickStart Guideで確認することができます。
ここでは、Exchangerates APIのエンドポイントの1つであるlatestにアクセスしてみましよう。latestのエンドポイントは、サブスクリプションプランに応じて、60分ごと、10分ごと、または60秒ごとに更新されるリアルタイムの為替レートデータを返します。
以下は上記のAccess KeyをURLパラメータに当てはめてlatestのエンドポイントへアクセスするURLの例です。
http://api.exchangeratesapi.io/v1/latest?access_key=5accc574727d0bc8007b88640ddd970d
上記のエンドポイントにアクセスすると、以下のようにJSON形式で為替レートデータが取得できます。
{
"success": true,
"timestamp": 1618443847,
"base": "EUR",
"date": "2021-04-14",
"rates": {
"AED": 4.401602,
"AFN": 92.987438,
"ALL": 123.189782,
"AMD": 622.325441,
"ANG": 2.150997,
"AOA": 771.454377,
"ARS": 111.049893,
"AUD": 1.550998,
"AWG": 2.156941,
"AZN": 2.046165,
"BAM": 1.960773,
"BBD": 2.419639,
"BDT": 101.557685,
"BGN": 1.956108,
"BHD": 0.4518,
"BIF": 2355.859391,
"BMD": 1.198301,
"BND": 1.602747,
"BOB": 8.262446,
"BRL": 6.775187,
"BSD": 1.198391,
"BTC": 1.9067596e-5,
"BTN": 90.06308,
"BWP": 13.096988,
"BYN": 3.135003,
"BYR": 23486.695865,
"BZD": 2.415529,
"CAD": 1.499979,
"CDF": 2391.808752,
"CHF": 1.105916,
"CLF": 0.030816,
"CLP": 850.318038,
"CNY": 7.824422,
"COP": 4381.9464,
"CRC": 734.603479,
"CUC": 1.198301,
"CUP": 31.754971,
"CVE": 110.932648,
"CZK": 25.94405,
"DJF": 212.962255,
"DKK": 7.437344,
"DOP": 68.255016,
"DZD": 158.571629,
"EGP": 18.777483,
"ERN": 17.976802,
"ETB": 49.55004,
"EUR": 1,
"FJD": 2.452563,
"FKP": 0.870416,
"GBP": 0.869667,
"GEL": 4.140164,
"GGP": 0.870416,
"GHS": 6.926206,
"GIP": 0.870416,
"GMD": 61.113259,
"GNF": 11983.008607,
"GTQ": 9.248383,
"GYD": 250.707366,
"HKD": 9.305333,
"HNL": 28.903569,
"HRK": 7.57158,
"HTG": 97.906362,
"HUF": 358.507893,
"IDR": 17515.083611,
"ILS": 3.931206,
"IMP": 0.870416,
"INR": 89.904135,
"IQD": 1751.316633,
"IRR": 50454.456016,
"ISK": 151.714206,
"JEP": 0.870416,
"JMD": 179.460912,
"JOD": 0.849552,
"JPY": 130.510579,
"KES": 127.98481,
"KGS": 101.611855,
"KHR": 4847.126741,
"KMF": 492.801162,
"KPW": 1078.470959,
"KRW": 1338.046775,
"KWD": 0.361276,
"KYD": 0.998693,
"KZT": 516.331626,
"LAK": 11287.993862,
"LBP": 1825.846885,
"LKR": 241.461698,
"LRD": 206.832071,
"LSL": 17.555151,
"LTL": 3.538271,
"LVL": 0.72484,
"LYD": 5.410369,
"MAD": 10.702619,
"MDL": 21.535088,
"MGA": 4535.568261,
"MKD": 61.636388,
"MMK": 1689.632611,
"MNT": 3415.939059,
"MOP": 9.586206,
"MRO": 427.793183,
"MUR": 49.357594,
"MVR": 18.514034,
"MWK": 943.661381,
"MXN": 24.066602,
"MYR": 4.947184,
"MZN": 73.899259,
"NAD": 17.5549,
"NGN": 455.949342,
"NIO": 42.036495,
"NOK": 10.054341,
"NPR": 144.100848,
"NZD": 1.677843,
"OMR": 0.461273,
"PAB": 1.198391,
"PEN": 4.348335,
"PGK": 4.229665,
"PHP": 58.092767,
"PKR": 183.160095,
"PLN": 4.554208,
"PYG": 7547.686137,
"QAR": 4.363013,
"RON": 4.926575,
"RSD": 117.877158,
"RUB": 91.127306,
"RWF": 1171.339041,
"SAR": 4.494591,
"SBD": 9.559982,
"SCR": 18.14974,
"SDG": 455.955933,
"SEK": 10.143077,
"SGD": 1.600804,
"SHP": 0.870416,
"SLL": 12252.625895,
"SOS": 699.807988,
"SRD": 16.960723,
"STD": 24839.742882,
"SVC": 10.486172,
"SYP": 1506.944044,
"SZL": 17.554312,
"THB": 37.538567,
"TJS": 13.664046,
"TMT": 4.206036,
"TND": 3.287535,
"TOP": 2.735603,
"TRY": 9.677839,
"TTD": 8.146733,
"TWD": 33.952055,
"TZS": 2778.859514,
"UAH": 33.497945,
"UGX": 4315.378685,
"USD": 1.198301,
"UYU": 52.971442,
"UZS": 12589.347994,
"VEF": 256232928513.0559,
"VND": 27655.584381,
"VUV": 131.260508,
"WST": 3.033771,
"XAF": 657.576278,
"XAG": 0.047174,
"XAU": 0.00069,
"XCD": 3.238468,
"XDR": 0.841171,
"XOF": 660.854586,
"XPF": 120.009287,
"YER": 299.994695,
"ZAR": 17.244269,
"ZMK": 10786.147736,
"ZMW": 26.585877,
"ZWL": 385.853094
}
}
Exchangerates APIには、5つの主要なAPIエンドポイント(latest, historical, convert, time series, fluctuation)があり、これらを通して様々な種類のデータにアクセスすることができます。詳しくはこちら(英語)のドキュメントを参照ください。ただし、これらのエンドポイントの中には無償プランでは利用できないものもあります。
(3)アプリケーションへ組み込む
これでRESTデバッガやREST クライアント・アプリケーションで接続をテストできるようになりました。
RESTデバッガによるコンポーネントの接続と設定
RESTデバッガで為替レートを取得するには、API Access Keyを含むURLをコピーしてください。(下図は、その実行例です)
たとえば、このAPIのリンクとRESTデバッガを使用すると、ユーロベースのすべての為替レートを簡単に読み取ることができます。RESTデバッガの「表データ」タブに移動し、JSON ルート要素に「rates」と入力して「適用」ボタンを押します。すると下図の例のようにすべての為替レートが表示されます。
RESTデバッガの優れた機能の1つは、Delphi/C++Builder向けアプリケーションのコンポーネントセットとして簡単にコピーできることです。RESTデバッガの [コンポーネントをコピー]を押すと、下図のようにいくつかのコンポーネントがクリップボードにコピーされます。
クリップボードにコピーされるコンポーネントはTRESTClient、TRESTRequest、TRESTResponse、TRESTResponseDatasetAdapter、TFDMemTableなどで、コビーされたコンポーネントは、フォームデザイナにそのまま貼り付けることができます。
では、実際にExchangeRatesAPIにアクセスするDelphi/C++Builderアプリケーションを作成して試してみましょう。
RESTデバッガの設定を利用したREST接続
(1) DelphiあるいはC++Builder向けの新しいマルチデバイスアプリケーション(FMX)のプロジェクトを作成し、すべてのユニットファイルとプロジェクトファイルをフォルダに保存します(例:ExchangeRatesAPI)
(2)前述のようにRESTデバッガの[コンポーネントのコピー]ボタンを押して、REST関連のコンポーネントををフォームに貼り付けてください。ペーストするとコンポーネントは重なっている表示されるため、下図のようにフォーム上のコンポーネントを名前が見えるように位置を調整してください。
(3)すべてのJSONデータを見るためにTButtonとTMemoコンポーネントを1つずつフォーム上に配置してください。
(4) Button1をダブルクリックして、OnClickイベントハンドラに以下のコードを追加してください。
C++Builderのコード例:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RESTRequest1->Execute();
TJSONValue *jValue = RESTResponse1->JSONValue;
Memo1->Lines->Add( jValue->ToString() );
}
Delphiのコード例:
procedure TForm1.Button1Click(Sender: TObject); var jValue: TJSONValue; begin RESTRequest1.Execute; jValue := RESTResponse1.JSONValue; Memo1.Lines.Add(jValue.ToString); end;
Delphiの場合は、uses句にSystem.JSONユニットを追加してください。
(5) プロジェクトをビルドして、アプリケーションを実行し、Button1をクリックすると、ExchangeRatesAPIへアクセスし、すべての為替レートのデータがJSON形式で取得され、Memoのテキスト欄にJSON文字列が表示されます。下図はその例です。
このようにRESTデバッガの機能を利用すると、予めREST接続に必要な情報が各コンポーネントに自動的に設定されていたので、ほとんどコードを書かずにExchangeRatesAPIへアクセスするアプリケーションが簡単に作成できました。
もちろんRESTデバッガを利用しないで、手動でRESTコンポーネントを設定してREST接続を行うこともできます。次はExchangeRatesAPIへアクセスするアプリケーションをスクラッチで1から作成してみましょう。
RESTコンポーネントを利用したREST接続
続いて、RESTデバッガに頼らないでExchangeRatesAPIへアクセスするアプリケーションを作成してみたいと思います。
ここでは、RESTクライアントライブラリの詳しい使い方について詳しく触れませんが、もしご興味があれば、こちらのチュートリアルを参考ください。
(1) DelphiあるいはC++Builder向けの新しいマルチデバイスアプリケーション(FMX)のプロジェクトを作成し、すべてのユニットファイルとプロジェクトファイルをフォルダに保存します(例:ExchangeRatesAPI)
(2)すべてのJSONデータを見るためにTButtonとTMemoコンポーネントを1つずつフォーム上に配置してください。
(3) ツールパレットの[REST Client]ページからTRESTClient 、 TRESTRequest、TRESTResponseの各コンポーネントを1つずつフォーム上に配置してください。
(4) フォーム上のRESTClient1をクリックし、[オブジェクトインスペクタ]を表示します。
https://exchangeratesapi.io/documentation/のドキュメントに記載されているようにRESTClient1のBaseURLプロパティに”http://api.exchangeratesapi.io/v1”を設定するか、この後で説明する(5)のようにコードを変更してください
続いてRESTClient1のParamsプロパティをダブルクリックし、以下のように2つのパラメータを追加してください。
- 名前=Endpoint、Value=latest
- 名前=access_key、Value=(あなたのアクセスキー)
下図は、パラメータを追加した例です。
(あなたのアクセスキー)は、必ず自身のアカウントで取得したAPI Access Keyに置き換えてください。
(5)Button1をダブルクリックして、OnClickイベントハンドラ内に以下のようなRESTClientとRESTRequestパラメータに設定するコードを追加し、RESTResponseから結果を取得します。
C++Builderのコード例:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RESTClient1->BaseURL = "http://api.exchangeratesapi.io/v1";
RESTClient1->AddParameter( "EndPoint", "latest", TRESTRequestParameterKind::pkGETorPOST);
RESTClient1->AddParameter( "access_key", "5accc574727d0bc8007b88640ddd970d", TRESTRequestParameterKind::pkGETorPOST);
RESTRequest1->Resource = "latest";
RESTRequest1->Method = TRESTRequestMethod::rmGET;
RESTRequest1->Response = RESTResponse1;
RESTRequest1->Response->ContentType = "application/json";
RESTRequest1->Response->ContentEncoding="UTF-8";
RESTRequest1->Execute();
TJSONValue *jValue = RESTResponse1->JSONValue;
Memo1->Lines->Add(jValue->ToString());
}
Delphiのコード例:
procedure TForm1.Button1Click(Sender: TObject);
var
jValue: TJSONValue;
begin
RESTClient1.BaseURL := 'http://api.exchangeratesapi.io/v1';
RESTClient1.AddParameter('EndPoint','latest',TRESTRequestParameterKind.pkGETorPOST);
RESTClient1.AddParameter('access_key', '5accc574727d0bc8007b88640ddd970d',TRESTRequestParameterKind.pkGETorPOST);
RESTRequest1.Resource := 'latest';
RESTRequest1.Method := TRESTRequestMethod.rmGET;
RESTRequest1.Response := RESTResponse1;
RESTRequest1.Response.ContentType := 'application/json';
RESTRequest1.Response.ContentEncoding := 'UTF-8';
RESTRequest1.Execute;
jValue := RESTResponse1.JSONValue;
Memo1.Lines.Add(jValue.ToString);
end;
Delphiの場合は、uses句にSystem.JSONユニットを追加してください。
(6) プロジェクトをビルドして、アプリケーションを実行し、Button1をクリックすると、ExchangeRatesAPIへアクセスし、すべての為替レートのデータがJSON形式で取得され、Memoのテキスト欄にJSON文字列が表示されます。
まとめ
apilayerが提供するExchangeRatesAPI.ioを利用すると、RAD StudioのRESTコンポーネントで簡単に為替レートが取得できます。もしこのブログをご覧いただいて興味を持ちましたら、一度試してみてください。

