Web API の例(OpenWeatherMap)と呼び出し方法

(ブログ記事の一覧は「こちら」)

HTTP通信(Java)の応用として、Web APIを実行するサンプルプログラムを作成してみましょう。

API とは、Application Programming Interface (アプリケーション・プログラミング・インタフェース) の略で、他のアプリケーションにアクセスすることのできる公開されたプログラム(関数)のことです。

最近では、Web APIの実行結果でよく使われるフォーマットとしては、JSONが多く見られます。ここでは、JSONフォーマットを出力するWeb APIの例として、天気情報を取得するWeb APIである「OpenWeatherMap API」を試してみます。

準備

まずはOpenWeatherMap のサイトにアクセスして、右上の「Sign Up」からユーザー登録を行ってください。(無料)
登録が完了すると、APIを利用するための「App ID」が作成されます。

OpenWeatherMap APIは、無料で使用することができますが、条件や制限されているものもあります。詳しくはOpenWeatherMapのサイトを確認してみてください。

OpenWeatherMap APIの種類

API一覧のうち、無料で利用できるAPIは以下になります。

  • Current Weather Data : 現在の天気情報
  • 5 Day / 3 Hour Forecast : 3時間ごとの5日間の天気予報

それぞれ、「東京」の現在の天気と天気予報の情報を受け取るOpenWeatherMap APIのURLは以下になります。(最後の xxxx ... の部分は、登録時に取得した「App ID」を入力します。)

Current Weather Data(現在の天気情報)
https://api.openweathermap.org/data/2.5/weather?q=tokyo&appid=xxxxxxxxxxxxxxxxxxxxxxxx
5 Day / 3 Hour Forecast(3時間ごとの5日間の天気予報)
https://api.openweathermap.org/data/2.5/forecast?q=tokyo&appid=xxxxxxxxxxxxxxxxxxxxxxxx

それぞれのURLにアクセスして成功すると、天気に関する情報のJSONデータが取得されることがわかります。

例題(現在の天気情報)

まず、「Current Weather Data」のURLを作成します。URLに指定した地域と取得した「App ID」を入力して、完成したURLをブラウザでアクセスして、正しい結果が得られることを確認してください。

現在の天気情報の出力結果の例

OpenWeatherMap APIによる、「東京」の現在の天気情報の、出力結果の例です。

{
    "coord": {
        "lon": 139.76,
        "lat": 35.68
    },
    "weather": [
        {
            "id": 801,
            "main": "Clouds",
            "description": "few clouds",
            "icon": "02d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 283.95,
        "feels_like": 278.39,
        "temp_min": 282.04,
        "temp_max": 287.04,
        "pressure": 1025,
        "humidity": 39
    },
    "visibility": 10000,
    "wind": {
        "speed": 4.6,
        "deg": 360
    },
    "clouds": {
        "all": 20
    },
    "dt": 1578278882,
    "sys": {
        "type": 1,
        "id": 8074,
        "country": "JP",
        "sunrise": 1578261066,
        "sunset": 1578296472
    },
    "timezone": 32400,
    "id": 1850147,
    "name": "Tokyo",
    "cod": 200
}

JSON 整形」などで検索すると、上記のような見やすい表記に修正してくれるサイトが見つかります。データの構造を素早く理解するのに有効ですので、利用をお勧めします。

HTTP通信プログラムの作成

次に、HTTP通信(Java)の方法を用いて、「Current Weather Data」のURLにアクセスして、(指定した地域の)現在の天気情報を取得するJavaのプログラムを作成します。

JSONデータのパース(解析)

次に、JSONデータのパースを行い、取得したい情報のみを出力するプログラムを作成します。

以下は、「場所」「気温」「現在の天気」の情報を抜き出して取得した例です。

   // JSONオブジェクトのインスタンス作成
    JSONObject jsonObj = new JSONObject(sbSentence.toString());

    // 場所
    System.out.println(jsonObj.get("name"));

    // 気温
    JSONObject jsonObjMain = jsonObj.getJSONObject("main");
    float fTempK = jsonObjMain.getFloat("temp");
    System.out.println(fTempK);

    // 現在の天気
    JSONArray jsonArray = jsonObj.getJSONArray("weather");
    JSONObject jsonObjWeather = jsonArray.getJSONObject(0);
    String strWeather = jsonObjWeather.getString("main");
    System.out.println(strWeather);
パラメータの追加

オプションのパラメータを追加することで、取得する結果が変化します。以下のパラメータを追加すると結果もわかりやすくなるので便利です。

  • オプション「units=metric」

上記の例を出力すると、気温の値が通常と異なることがわかります。これは指定している単位が異なるようです。オプション「units=metric」を追加することで、普段使っている温度の単位で表示させることができます。

https://api.openweathermap.org/data/2.5/weather?q=tokyo&units=metric&appid=xxxxxxxxxxxxxxxxxxxxxxxx
  • オプション「lang=ja」

結果の一部が日本語で取得することができます。

https://api.openweathermap.org/data/2.5/weather?q=tokyo&lang=ja&appid=xxxxxxxxxxxxxxxxxxxxxxxx

もちろん、両方のパラメータを追加することも可能です。

https://api.openweathermap.org/data/2.5/weather?q=tokyo&units=metric&lang=ja&appid=xxxxxxxxxxxxxxxxxxxxxxxx
参考

OpenWeatherMapでは天気の画像が用意されています。以下のリンクを参照してください。

https://openweathermap.org/weather-conditions

「快晴(clear sky)」を取得する場合は、以下のURLになります。

https://openweathermap.org/img/wn/01d@2x.png

練習課題1

地域について、例題の「東京」から、あなたの国の都市に変更して、正しい結果が得られることを確認してください。

練習課題2

上記の例の他に、以下の追加の情報を出力するようにプログラムを修正してください。

  • description(詳細の天気)
  • temp_max(最高気温)
  • pressure(気圧)
  • humidity(湿度)

課題(天気予報)

例題の方法を用いて、東京の天気予報の情報を取得するプログラムを作成してください。

https://api.openweathermap.org/data/2.5/forecast?q=tokyo&appid=xxxxxxxxxxxxxxxxxxxxxxxx

3時間ごとの5日間の天気予報の情報が取得することができます。

1日あたり8の情報(24時間 ÷ 3時間 = 8)が得られるので、合計40(8 x 5日間 = 40)の天気予報の情報が得られることになります。そのことから、得られるJSONデータ量も多いものになります。

プログラムで出力するする情報は、各自で提案してもらえれば良いと思いますが、例えば「日時」「天気」「気温」の組み合わせを各時刻分(40の情報)だけ出力することができれば十分かと思います。