投稿日:2019年10月17日
UnityWebRequestはUnityが提供している通信ライブラリです。このドキュメントだけだと初心者の方は使い方がわからないのでは?と思ったので使い方をまとめました。
UnityWebRequestはUnity公式が出している通信用モジュールです。RestAPIを叩く場合やWebページの情報を取得する場合などのHttpの通信を行う場合には基本的にこのモジュールを使っておけば問題ないでしょう。この記事ではこのUnityWebRequestの使い方についてまとめます。
僕が使っている限り、このモジュール自体にはバグなどの問題はないように思います。問題があるのはUnity公式ドキュメントのほうにあります。この記事ではモジュールの使い方と合わせてドキュメントのどこに問題があるのかについても解説します。
GETのリクエストを送る場合、基本的に公式ドキュメントのやり方そのままで実装できます。しかし、注意してほしいのはSendメソッドが非推奨(新しいメソッドあるのでそっち使って~。古いほうはそのうち消えちゃうよ~)になっている事です。
はい。これがUnityドキュメントの問題点その1です。
我々エンジニアは公式のドキュメントを最も信用しています。このサイトのようなエンジニアブログやQiitaなどのSNSは間違いのある可能性があり、あくまで補助的な資料程度に考えています。
それなのに公式ドキュメントが更新されないとは...(汗)。
それ以外の箇所については公式の通りで問題ありません。
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
StartCoroutine(APIExample());
}
// Update is called once per frame
void Update()
{
}
IEnumerator APIExample()
{
string url = "http://fakerestapi.azurewebsites.net/api/Authors";
UnityWebRequest request = UnityWebRequest.Get(url);
// データをJSONで受け取りたいのでHeaderをセット
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
// エラーが起きた場合はエラー内容を表示
Debug.Log(request.error);
}
else
{
// レスポンスをテキストで表示
Debug.Log(request.downloadHandler.text);
// もし画像データなどの場合はバイトデータとして受け取る
byte[] results = request.downloadHandler.data;
}
}
}
POSTリクエストを送る際、多くの場合でサーバーに何かしらのデータを送ることになります。データを送る方法はいくつかあるのですが、ほとんどのRestAPIはjson形式のデータをbodyに入れて送ってもらうような仕様になっています。
ここでUnity公式ドキュメントの問題点二つ目です。
公式ドキュメントにはUnityWebRequestをどのように使うかのサンプルが書いてあるのです。それがなんとそのサンプルのコードがデータをform形式で送っているものしかないのです!!RestAPIを使って開発をしている方はこれがどれほどおかしいかわかっていただけるでしょう。世の中のRestAPIはほとんどjson形式でデータをやり取りしているのです。Unityでデータを受け取るときもおそらくほとんどの割合でデータの形式はjsonでしょう。(Unityで使うデータをHTMLやXMLで受け取ってもしょうがないからね!)
つまり...
ドキュメントの通りのコードでは世の中のほとんどのRestAPIは使えない。
ということなのです...(汗)。
jsonで送る場合にはデータ用のClassを作りそのインスタンスをJsonUtilityでJson形式にして送りましょう!!
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
StartCoroutine(APIExample());
}
// Update is called once per frame
void Update()
{
}
public class PostData
{
public string name;
public string salary;
public string age;
}
IEnumerator APIExample()
{
string url = "http://fakerestapi.azurewebsites.net/api/Authors";
// JSONのデータをBodyに入れてPOSTする
PostData postData = new PostData();
postData.name = "ogihara";
postData.salary = "123";
postData.age = "234";
string myJson = JsonUtility.ToJson(postData);
byte[] byteData = System.Text.Encoding.UTF8.GetBytes(myJson);
UnityWebRequest request = new UnityWebRequest(url, "POST");
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(byteData);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
yield return request.SendWebRequest();
}
}