UnityでHTTPに接続する

Unityのバージョン: Unity 2017.4.13f1
https://unity3d.com/jp/get-unity/download/archive

zipcloud 郵便番号検索API
http://zipcloud.ibsnet.co.jp/doc/api

#Unity側の設定
1. Hierarchyに空のゲームオブジェクトを作成して名前をMainControllerにします。
2. 名前がMainControllerのC#ファイルを作成して、ゲームオブジェクトのMainControllerのコンポーネントに追加します。
3. UI > Textオブジェクトを作成して、MainControllerスクリプトのプロパティText Resultにセットします。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/353060/989d8a93-588e-f0a0-2b54-c5382ca31e4a.png)
4. UI > Buttonオブジェクトを作成して、On Clickプロパティを+ボタンで追加します。
5. 追加したOn ClickプロパティにMainControllerオブジェクトをセットして、FunctionにMainControllerのOnClickメソッドを指定します。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/353060/055068ec-ae97-5a64-f5b8-3ffe351c6a27.png)




#UnityからHTTPにGET接続する方法

```C#:MainController.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class MainController : MonoBehaviour
{
    //接続するURL
    private const string URL = "http://zipcloud.ibsnet.co.jp/api/search?zipcode=7830060";

    //ゲームオブジェクトUI > ButtonのInspector > On Click()から呼び出すメソッド
    public void OnClick()
    {
        //コルーチンを呼び出す
        StartCoroutine("OnSend", URL);
    }

    //コルーチン
    IEnumerator OnSend(string url)
    {
        //URLをGETで用意
        UnityWebRequest webRequest = UnityWebRequest.Get(url);
        //URLに接続して結果が戻ってくるまで待機
        yield return webRequest.SendWebRequest();

        //エラーが出ていないかチェック
        if (webRequest.isNetworkError)
        {
            //通信失敗
            Debug.Log(webRequest.error);
        }
        else
        {
            //通信成功
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}
```

#UnityからHTTPにPOST接続する方法

```C#:MainController.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class MainController : MonoBehaviour
{
    //接続するURL
    private const string URL = "http://zipcloud.ibsnet.co.jp/api/search";

    //ゲームオブジェクトUI > ButtonのInspector > On Click()から呼び出すメソッド
    public void OnClick()
    {
        //コルーチンを呼び出す
        StartCoroutine("OnSend", URL);
    }

    //コルーチン
    IEnumerator OnSend(string url)
    {
        //POSTする情報
        WWWForm form = new WWWForm();
        form.AddField("zipcode", 1000001);

        //URLをPOSTで用意
        UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
        //UnityWebRequestにバッファをセット
        webRequest.downloadHandler = new DownloadHandlerBuffer();
        //URLに接続して結果が戻ってくるまで待機
        yield return webRequest.SendWebRequest();

        //エラーが出ていないかチェック
        if (webRequest.isNetworkError)
        {
            //通信失敗
            Debug.Log(webRequest.error);
        }
        else
        {
            //通信成功
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}
```

#UnityでJSONデータを読み込んでSerializableクラスに入れる方法
```C#:MainController.cs
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class MainController : MonoBehaviour
{
    //接続するURL
    private const string URL = "http://zipcloud.ibsnet.co.jp/api/search";
    //JSONデータを表示するUI > Textオブジェクト
    public Text textResult;

    //ゲームオブジェクトUI > ButtonのInspector > On Click()から呼び出すメソッド
    public void OnClick()
    {
        //コルーチンを呼び出す
        StartCoroutine("OnSend", URL);
    }

    //コルーチン
    IEnumerator OnSend(string url)
    {
        //POSTする情報
        WWWForm form = new WWWForm();
        form.AddField("zipcode", 1000001);

        //URLをPOSTで用意
        UnityWebRequest webRequest = UnityWebRequest.Post(url, form);
        //UnityWebRequestにバッファをセット
        webRequest.downloadHandler = new DownloadHandlerBuffer();
        //URLに接続して結果が戻ってくるまで待機
        yield return webRequest.SendWebRequest();

        //エラーが出ていないかチェック
        if (webRequest.isNetworkError)
        {
            //通信失敗
            Debug.Log(webRequest.error);
        }
        else
        {
            //通信成功
            //ZipクラスにJSONデータを格納する
            Zip zip = JsonUtility.FromJson<Zip>(webRequest.downloadHandler.text);
            //zipクラスに格納したJSONデータをゲームオブジェクトUI > Textに出力する
            textResult.text = zip.message + "," + zip.results.Length + "," + zip.status;
            foreach (ZipResult zr in zip.results)
            {
                textResult.text += string.Format("\n{0},{1},{2},{3}", zr.address1, zr.address2, zr.address3, zr.prefcode);
            }
        }
    }
}

```
読み込むJSONデータ

```txt:JSONデータ.txt
{
	"message": null,
	"results": [
		{
			"address1": "東京都",
			"address2": "千代田区",
			"address3": "千代田",
			"kana1": "ﾄｳｷｮｳﾄ",
			"kana2": "ﾁﾖﾀﾞｸ",
			"kana3": "ﾁﾖﾀﾞ",
			"prefcode": "13",
			"zipcode": "1000001"
		}
	],
	"status": 200
}
```
JSONデータを格納するためのSerializableクラス

```C#:Zip.cs
[System.Serializable]
public class Zip
{
    public string message;
    public ZipResult[] results;
    public int status;
}
```

```C#:ZipResult.cs
[System.Serializable]
public class ZipResult
{
    public string address1;
    public string address2;
    public string address3;
    public string kana1;
    public string kana2;
    public string kana3;
    public string prefcode;
    public string zipcode;
}
```