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
コメント