Delphi XE7のRESTコンポーネントを使って、天気予報を取得する

Delphi XE7のRESTコンポーネントを使って、天気予報を取得する方法を紹介します。

天気予報の情報は、「お天気Webサービス」から取得します。

サービスの使用を見るとわかるように、指定されたURLにアクセスすると、JSON形式で天気概況情報が返されます。

FireMonkeyマルチプラットフォームアプリケーションを新規に作成します。

00

01

フォームに次のコンポーネントを配置します。

  • 地域IDを入力するTEditコンポーネント
  • 処理を実行するTButtonコンポーネント
  • 実行結果を表示するTMemoコンポーネント
  • 取得情報を表示するTLabelコンポーネント
  • TRESTRequestコンポーネント
  • TRESTResponseコンポーネント
  • TRESTClientコンポーネント

03

ボタンを押したときの処理を記述します。

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 のすべてのプラットフォームで動作可能です。

win1

win2

android1

android2

mac1

mac2

DelphiのJSON関連の記事

コメント

  1. 10.2 Tokyoでプログラムをテストしたのですが,取得ボタンをクリックすると”REST要求が失敗しました: Unicode文字のマッピングがターゲットのマルチバイトコードページに存在しません”と表示されます。何がいけないのでしょうか?

  2. 原因がわかりました。IDの間違いでした。IDが違うと上記のエラーが出るようです。正しいIDを入れたら動作しました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です