Delphi XE7のRESTコンポーネントを使って、天気予報を取得する方法を紹介します。
天気予報の情報は、「お天気Webサービス」から取得します。
サービスの使用を見るとわかるように、指定されたURLにアクセスすると、JSON形式で天気概況情報が返されます。
FireMonkeyマルチプラットフォームアプリケーションを新規に作成します。
フォームに次のコンポーネントを配置します。
- 地域IDを入力するTEditコンポーネント
- 処理を実行するTButtonコンポーネント
- 実行結果を表示するTMemoコンポーネント
- 取得情報を表示するTLabelコンポーネント
- TRESTRequestコンポーネント
- TRESTResponseコンポーネント
- TRESTClientコンポーネント
ボタンを押したときの処理を記述します。
procedure TForm1.Button1Click(Sender: TObject);
begin
RESTRequest1.ResetToDefaults;
RESTClient1.ResetToDefaults;
RESTResponse1.ResetToDefaults;
RESTClient1.BaseURL := 'http://weather.livedoor.com/';
RESTRequest1.Resource := 'forecast/webservice/json/v1?city={CITY}';
RESTRequest1.Params.AddItem('CITY', Edit1.Text,
TRESTRequestParameterKind.pkURLSEGMENT);
RESTRequest1.Execute;
end;
RESTRequest1のResourceプロパティに設定しているURLにはCITYパラメータが含まれています。
RESTRequest1.Resource := 'forecast/webservice/json/v1?city={CITY}';
パラメータの値は、RESTRequest1.Params.AddItemで設定します。
Edit1に入力されている値を設定しています。
RESTRequest1.Params.AddItem('CITY', Edit1.Text,
TRESTRequestParameterKind.pkURLSEGMENT);
RESTRequest1のOnAfterExecuteイベントを追加します。
procedure TForm1.RESTRequest1AfterExecute(Sender: TCustomRESTRequest);
const
KEYS: array [0 .. 2] of string = ('dateLabel', 'telop', 'date');
var
JSONValue: TJSONValue;
Forecasts: TJSONArray;
Forecast: TJSONValue;
Key: string;
begin
Memo1.Lines.Clear;;
Label1.Text := 'URI: ' + Sender.GetFullRequestURL + ' Execution time: ' +
IntToStr(Sender.ExecutionPerformance.TotalExecutionTime) + 'ms';
if Assigned(RESTResponse1.JSONValue) then
begin
JSONValue := RESTResponse1.JSONValue;
Forecasts := JSONValue.GetValue<TJSONArray>('forecasts');
for Forecast in Forecasts do
begin
for Key in KEYS do
begin
Memo1.Lines.Add(Format('%s=%s',
[Key, Forecast.GetValue<TJSONString>(Key).ToString]));
end;
end;
end;
end;
返されたデータを適切な型に変換して表示しています。
RESTRequest1のHTTPProtocolErrorイベントを追加します。
procedure TForm1.RESTRequest1HTTPProtocolError(Sender: TCustomRESTRequest);
begin
Memo1.Lines.Add(Sender.Response.StatusText);
Memo1.Lines.Add(Sender.Response.Content);
end;
アプリケーションを実行します。
Windows / MAC OS X / Android / iOS のすべてのプラットフォームで動作可能です。
10.2 Tokyoでプログラムをテストしたのですが,取得ボタンをクリックすると”REST要求が失敗しました: Unicode文字のマッピングがターゲットのマルチバイトコードページに存在しません”と表示されます。何がいけないのでしょうか?
原因がわかりました。IDの間違いでした。IDが違うと上記のエラーが出るようです。正しいIDを入れたら動作しました。