
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



コメント