UnityWebRequest을 이용한 Unity HTTP 통신

2021년 08월 11일
태그 Unity

Reference 👉👉 Unity Manual UnityWebRequest

Unity에서 HTTP 통신을 할 필요가 생겨 찾아보았다.

echo server

const express = require('express');
const port = 8000

const app = express();
app.use(express.json())

app.post('/', function(req, res) {
    console.log(req.body)
    res.send(req.body)
});

app.get('/', function(req, res) {
    res.send({hello: "world"})
});

app.listen(port, '0.0.0.0', () => {
    console.log(`Example app listening at http://0.0.0.0:${port}`)
})

테스트용 서버다. 데이터를 받으면 받은 것을 다시 보내주고, get을 호출하면 {“hello”:”world”}를 보내준다.

GET request

IEnumerator get()
{
    Debug.Log("Call get");
    using (UnityWebRequest www = UnityWebRequest.Get(url))
    {
        yield return www.SendWebRequest();

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

POST request

IEnumerator post()
{
    Debug.Log("Call post");

    ls.Add("foo", "bar");
    var jsonfile = JsonConvert.SerializeObject(ls);

    using (UnityWebRequest www = new UnityWebRequest(url, "POST"))
    {
        www.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonfile));
        www.downloadHandler = new DownloadHandlerBuffer();
        www.SetRequestHeader("Content-Type", "application/json");
        yield return www.SendWebRequest();

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

Web Request를 보낸 뒤 성공 여부를 받기 위해 코루틴을 사용한다.

www.downloadHandler = new DownloadHandlerBuffer();
...
Debug.Log(www.downloadHandler.text);

POST의 경우 downloadHandler가 있어야 서버에서 보내준 것을 받아올 수 있었기 때문에 별도로 만들어 주었지만, GET의 경우에는 별도로 생성할 필요가 없었다.

using UnityEngine.Networking;
using Newtonsoft.Json;
using System.Text;

위와 같은 namespace를 사용하였다.