Unity : UnityWebRequest + JsonUtility で API操作 GET/POST/PUT/DELETE

Unity
Unity - Scripting API: Networking.UnityWebRequest.Get
JsonUtility-FromJson - Unity スクリプトリファレンス
JSON からオブジェクトを作成します。

そのままですが

jsonでデータを扱うAPIを作って unityで処理しました。

GET、APIデータ取得

サンプル通りですが

public class Example : MonoBehaviour
{
    void Start()
    {
        // A correct website page.
        StartCoroutine(GetRequest("https://www.example.com"));

        // A non-existing page.
        StartCoroutine(GetRequest("https://error.html"));
    }

    IEnumerator GetRequest(string uri)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
        {
            // Request and wait for the desired page.
            yield return webRequest.SendWebRequest();

            string[] pages = uri.Split('/');
            int page = pages.Length - 1;

            switch (webRequest.result)
            {
                case UnityWebRequest.Result.ConnectionError:
                case UnityWebRequest.Result.DataProcessingError:
                    Debug.LogError(pages[page] + ": Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.ProtocolError:
                    Debug.LogError(pages[page] + ": HTTP Error: " + webRequest.error);
                    break;
                case UnityWebRequest.Result.Success:
                    Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
                    break;
            }
        }
    }
}

Startのところを自分のURLに変更

string apiUrl = "https://---/api/item";
StartCoroutine(GetRequest(apiUrl));

でGetRequestを呼びます。

JsonUtility で classに変換

webRequest.downloadHandler.text を json => class に変換します。

ベースのレスポンスデータclass

 [System.Serializable]
    public class ApiDataBase
    {
        public int s; // status
        public int e; // error
        public string m; // message
        public ApiDataItem[] items;
        public static ApiDataBase CreateFromJSON(string jsonString)
        {
            return JsonUtility.FromJson<ApiDataBase>(jsonString);
        }
}

itemsをリストで取得するパターンです。

こんな itemとして

    [System.Serializable]
    public class ApiDataItem
    {
        public int id;
        public string itemname;
        public int level;
        public string token;

        public static ApiDataItem CreateFromJSON(string jsonString)
        {
            return JsonUtility.FromJson<ApiDataItem>(jsonString);
        }
    }

これで Jsonが変換されました!
抜けているデータはnullになってくれるので大丈夫そうです。

ApiDataBase data = JsonUtility.CreateFromJSON( webRequest.downloadHandler.text );

classデータをJsonに変換

JsonUtility.ToJson(data);

こんな感じでjsonに戻せました^^

{
"s":200,
"e":0,
"m":"index result",
"items":[
    {"id":100,"itemname":"indexuser","level":3,"token":"abc","ext":""}
    {"id":101,"itemname":"iu2","level":3,"token":"def","ext":""}
]
}

itemを一つpostしてみますか。
https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.Post.html

これもこのままですが

    IEnumerator Upload()
    {
        //item = {"id":0,"itemname":"im3","level":100,"token":"hello","ext":"extmemo"}
        string itemString = JsonUtility.ToJson(item);

        WWWForm form = new WWWForm();
        form.AddField("item", itemString);

        UnityWebRequest www = UnityWebRequest.Post(apiUrl, form);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log("Form upload complete!");
        }
    }

問題なくデータアップロードできました^^

PUTで更新してみる

postとput何が違うのかと?
https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest.Put.html

UTF8に変換しましょうと書いてあるけどサンプル通り

IEnumerator Upload()
    {
        byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data");
        using (UnityWebRequest www = UnityWebRequest.Put(apiUrl, myData))
        {
            yield return www.SendWebRequest();

            if (www.result != UnityWebRequest.Result.Success)
            {
                Debug.Log(www.error);
            }
            else
            {
                Debug.Log("Upload complete!");
            }
        }
    }

普通にJSONを送信できました^^

サーバー側でcodeigniterを使っているのですが request->getJson(); でそのまま利用できました^^v
gerRawInputだと key1=data1&key2=data2みたいなのをrequestBodyで送って使うようです^^

DELETEもついでに

UnityWebRequest.Delete(apiUrl);

これでDELETEメソッドになります^^v

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました