前回から Unityで REST API(RESTful API)でのシステム連携の方法を説明しています。前回はREST APIの説明を主に行いました。
今回は具体的な Unityでの REST APIの使用法の解説と、実際に REST APIでの天気予報情報の取得方法を説明します。
【UnityでREST APIの使用法】
では Unityで簡単な REST API接続を作ってみましょう。
ここでは、前回最初に紹介した「天気予報API(livedoor天気互換)」( https://weather.tsukumijima.net/ )に REST API接続して情報を GETする部分を説明します。
(取得するデータは JSONデータですので、それを分解するのも含めた解説はこの後に説明します。)
まず、全体のソースを示します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; public class API_Test05 : MonoBehaviour { void Start() { StartCoroutine(Get_WeatherInfo()); } private IEnumerator Get_WeatherInfo() { //UnityWebRequestを生成 UnityWebRequest webRequest = UnityWebRequest.Get("https://weather.tsukumijima.net/api/forecast?city=130010"); //送受信開始 yield return webRequest.SendWebRequest(); if (webRequest.isHttpError || webRequest.isNetworkError) { //エラー確認 Debug.Log(webRequest.error); } else { //結果確認 Debug.Log(webRequest.downloadHandler.text); } } }
【ソース解説】
UnityWebRequestに関して、重要な部分の解説します。
① :まず、UnityWebRequestを使うには「using UnityEngine.Networking;」が必要です。
② :UnityWebRequestの Getリクエストの結果を待つのでコルーチンで非同期処理としてメインのメソッドを呼び出す。
③ :UnityWebRequestの Getリクエストを生成します。
(ここで天気予報APIの URIを指定していますが、例として東京(city=130010)の天気を指定しています。)
メソッドの指定が Postや Put等であれば、Get以外を使用します。
(ここで天気予報APIの URIを指定していますが、例として東京(city=130010)の天気を指定しています。)
メソッドの指定が Postや Put等であれば、Get以外を使用します。
④ :SendWebRequestで作成したリクエストを送信します。
⑤ :UnityWebRequestシステムエラーに対するエラー処理を記述します。
(isHttpError: HTTP response codeがエラーを示したらTrue、isNetworkError: UnityWebRequestシステムエラーが発生したらTrue)
(isHttpError: HTTP response codeがエラーを示したらTrue、isNetworkError: UnityWebRequestシステムエラーが発生したらTrue)
⑥ :DownloadHandlerが受け取ったリクエストに対する応答の中身を直接確認。
ここではJSONデータがそのまま確認できます。
ここではJSONデータがそのまま確認できます。
このプログラムの実行結果は以下の様になります。REST APIで取得した天気情報の中身が JSON形式で表示されています。
【Unityで天気予報データの取得】
次に今取得した「天気予報API(livedoor天気互換)」の天気予報JSONデータを分解してプログラム内で使用できるようにしてみましょう。
ここでは、ソースは全て載せておきますが、REST API接続での情報取得は前のプログラムと完全に同じなので説明は省きます。(必要な場合、前の章の説明をご確認下さい。)
まず、全体のソースを示します。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Networking; using LitJson; public class API_Test03 : MonoBehaviour { void Start() { StartCoroutine(Get_WeatherInfo()); } private IEnumerator Get_WeatherInfo() { //UnityWebRequestを生成 UnityWebRequest webRequest = UnityWebRequest.Get("https://weather.tsukumijima.net/api/forecast?city=130010"); //送受信開始 yield return webRequest.SendWebRequest(); if (webRequest.isHttpError || webRequest.isNetworkError) { //エラー確認 Debug.Log(webRequest.error); } else { //結果確認 Debug.Log(webRequest.downloadHandler.text); //JSON変換 JsonData jsonData = JsonMapper.ToObject(webRequest.downloadHandler.text); Debug.Log(jsonData["title"]); Debug.Log(jsonData["description"]["text"]); Debug.Log(jsonData["forecasts"][0]["date"]); Debug.Log(jsonData["forecasts"][0]["telop"]); Debug.Log(jsonData["forecasts"][0]["temperature"]["max"]["celsius"]); Debug.Log(jsonData["forecasts"][0]["chanceOfRain"]["18-24"]); Debug.Log(jsonData["forecasts"][1]["date"]); Debug.Log(jsonData["forecasts"][1]["telop"]); Debug.Log(jsonData["forecasts"][1]["temperature"]["max"]["celsius"]); Debug.Log(jsonData["forecasts"][1]["chanceOfRain"]["18-24"]); Debug.Log(jsonData["location"]["city"]); } } }
【ソース解説】
UnityWebRequestに関する解説は前章をご覧ください。ここでは JSON変換の部分を説明します。
ここでは Unity標準の JsonUtilityを使わず、LitJSON を使用しています。
その理由はこの天気予報APIで帰ってくる JSON形式が階層が深く複雑であるためです。天気の情報を取得してアプリを作りたいわけでなく、APIのテストを少しやることが今回の目的であるので JsonUtilityでJSON形式のクラスの定義が面倒かと思います。
LitJSONであると Unity標準ライブラリではないので下準備は必要ですが、LitJSON自体の使用法は以前紹介していますので、そちらをご覧ください。
⑦ :まず、LitJsonを使うには「using LitJson;」が必要です。
⑧ :DownloadHandlerが受け取ったリクエストに対する応答を JsonMapperで変換します。
⑨ :プログラムで利用できる形に分解した天気情報を Debug.Logで表示してみます。
このプログラムの実行結果は以下の様になります。プログラムで利用できる形に分解した天気情報がそれぞれ表示されています。
【注意事項】
「天気予報API(livedoor天気互換)」のサイトでも注意事項として書かれている通り、明後日のデータは基本的にとれず、時間帯によっては一部の情報がとれない場合もあるそうです。
その場合「null」が返ってきて、上記のプログラムもエラーが出る場合がありますので、その部分をコメントアウトするか、時間帯をずらしてお試しください。
その場合「null」が返ってきて、上記のプログラムもエラーが出る場合がありますので、その部分をコメントアウトするか、時間帯をずらしてお試しください。
Sponsored Link
分かりやすい解説ありがとうございます。