[Unity 이론] 유니티에 HTTP 통신하는 방법(POST, GET)

1. www 클래스

 

WWW 클래스는 유니티에서 제공하는 간단한 방법으로 웹 서버와 통신할 수 있게 해주는 클래스입니다. 웹 페이지의 데이터를 다운로드하거나, 이미지 등을 불러올 때 사용됩니다. 현재 WWW는 유니티에서 권장하지 않고 있습니다. 

 


2. UnityWebRequest 클래스

 

UnityWebRequest 클래스는 유니티에서 HTTP 통신을 할 수 있게 해주는 클래스입니다. GET, POST 등 다양한 HTTP 요청 방식을 지원하며, 파일 다운로드, 업로드와 같은 작업에도 사용됩니다. 유니티에서 WWW를 사용하기 보다는 UnityWebRequest를 사용하는 권장합니다.

 


2.1 GET 방식

 

GET 방식은 주로 서버로부터 정보를 조회하기 위해 사용되는 메서드입니다. 데이터를 요청할 때 필요한 매개변수를 URL의 일부로 포함시켜 서버에 전송합니다. URL에 데이터가 붙기 때문에, 전송할 수 있는 데이터의 크기가 제한적이며, 보안상 민감한 데이터를 전송하기에는 부적합할 수 있습니다.

 

아래 코드는 UnityWebRequest를 사용하여 GET 요청을 보내는 방법을 보여줍니다. 요청이 성공하면 응답 데이터를 로그로 출력합니다.

 

using UnityEngine.Networking;

IEnumerator GetRequest(string uri)
{
    using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
    {
        // 요청 보내기
        yield return webRequest.SendWebRequest();

        if (webRequest.isNetworkError || webRequest.isHttpError)
        {
            Debug.LogError(webRequest.error);
        }
        else
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}

 


2.2 POST 방식

 

POST 방식은 서버의 상태나 데이터를 생성하거나 업데이트하기 위해 사용되는 메서드입니다. 데이터는 요청 본문(body)에 포함되어 서버로 전송되며, URL에는 데이터가 노출되지 않습니다. 이 방식은 더 많은 양의 데이터를 안전하게 전송할 수 있으며, 파일 업로드와 같은 작업에 주로 사용됩니다.

 

아래 코드는 UnityWebRequest를 사용하여 POST 요청을 보내는 방법을 보여줍니다. postData에는 서버에 전송할 데이터가 포함됩니다.

 

using UnityEngine.Networking;
using System.Collections;

IEnumerator PostRequest(string uri, string postData)
{
    using (UnityWebRequest webRequest = UnityWebRequest.Post(uri, postData))
    {
        // 요청 보내기
        yield return webRequest.SendWebRequest();

        if (webRequest.isNetworkError || webRequest.isHttpError)
        {
            Debug.LogError(webRequest.error);
        }
        else
        {
            Debug.Log("Form upload complete!");
        }
    }
}

 


3. UploadHandler


UploadHandler는 UnityWebRequest 시스템 내에서 데이터를 서버로 전송하는 역할을 합니다. 클라이언트에서 서버로 데이터를 "업로드"할 때 사용됩니다. 예를 들어, 사용자가 입력한 데이터를 서버에 POST 요청으로 전송하고자 할 때 UploadHandler를 구성합니다. 또한 유니티에서는 서로 다른 유형의 데이터 업로드를 지원합니다. 여기에는  UploadHandlerRaw, UploadHandlerFile, UploadHandlerFormData가 있습니다. UploadHandlerRaw는 주로 JSON이나 텍스트 데이터를 전송할 때, UploadHandlerFile은 파일을 전송할 때, 그리고 UploadHandlerFormData는 폼 데이터와 파일을 함께 전송할 때 사용됩니다. 

 


3.1 UploadHandlerRaw

 

UploadHandlerRaw는 바이트 배열 데이터를 원시 형태로 업로드할 때 사용됩니다. 주로 JSON 데이터나 텍스트 데이터를 서버에 전송할 때 사용됩니다. contentType을 설정하여 HTTP 헤더의 Content-Type을 지정할 수 있습니다.

 

using UnityEngine;
using UnityEngine.Networking;

public class UploadRawDataExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        byte[] myData = System.Text.Encoding.UTF8.GetBytes("이것은 테스트 데이터입니다.");
        UnityWebRequest www = new UnityWebRequest("http://www.your-server.com/upload", "POST");
        UploadHandlerRaw uhr = new UploadHandlerRaw(myData);
        uhr.contentType = "application/json";
        www.uploadHandler = uhr;
        www.downloadHandler = new DownloadHandlerBuffer();

        yield return www.SendWebRequest();

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

 


3.2 UploadHandlerFile


UploadHandlerFile은 파일을 서버로 업로드할 때 사용됩니다. 이 핸들러를 사용하면 파일의 경로를 지정하여 파일 데이터를 직접 업로드할 수 있습니다.

 

using UnityEngine;
using UnityEngine.Networking;

public class UploadFileExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        string filePath = "path/to/your/file.txt";
        UnityWebRequest www = UnityWebRequest.Put("http://www.your-server.com/upload", filePath);
        www.uploadHandler = new UploadHandlerFile(filePath);

        yield return www.SendWebRequest();

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

3.3 UploadHandlerFormData


UploadHandlerFormData`는 폼 데이터나 파일을 멀티파트 폼 데이터 형식으로 업로드할 때 사용됩니다. 주로 사용자가 입력한 데이터나 업로드할 파일을 함께 서버에 전송할 때 사용합니다.

 

using UnityEngine;
using UnityEngine.Networking;
using System.Collections.Generic;

public class UploadFormDataExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Upload());
    }

    IEnumerator Upload()
    {
        List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
        formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
        formData.Add(new MultipartFormFileSection("myFile", "이것은 파일 데이터입니다.", "text/plain"));

        UnityWebRequest www = UnityWebRequest.Post("http://www.your-server.com/upload", formData);
        yield return www.SendWebRequest();

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

 


4. DownloadHandler


DownloadHandler는 서버로부터 데이터를 받아 클라이언트로 "다운로드"하는 역할을 합니다. 서버의 응답 데이터를 처리하고, 필요한 형태로 변환하여 애플리케이션에 제공합니다. 또한 유니티에서는 특정 유형의 데이터 처리에 최적화되어 있는 다운로드 핸들러를 제공하고 있습니다. 여기에는 DownloadHandlerBuffer, DownloadHandlerFile, DownloadHandlerAssetBundle 가 있습니다.  DownloadHandlerBuffer는 텍스트나 바이너리 데이터 처리에, DownloadHandlerFile은 파일 다운로드에, 그리고 DownloadHandlerAssetBundle은 애셋 번들 다운로드와 관리에 적합합니다.

 


4.1 DownloadHandlerBuffer

 

DownloadHandlerBuffer는 서버의 응답을 메모리 버퍼에 저장합니다. 이는 주로 텍스트나 바이너리 데이터를 처리할 때 사용됩니다. 저장된 데이터는 문자열이나 바이트 배열로 추출할 수 있습니다.

 

using UnityEngine;
using UnityEngine.Networking;

public class DownloadBufferExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Download());
    }

    IEnumerator Download()
    {
        UnityWebRequest www = UnityWebRequest.Get("http://www.your-server.com/data");
        www.downloadHandler = new DownloadHandlerBuffer();

        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            // 텍스트 데이터로 추출
            string textData = www.downloadHandler.text;
            Debug.Log(textData);
            // 또는 바이트 배열로 추출
            byte[] binaryData = www.downloadHandler.data;
        }
    }
}

 


4.2 DownloadHandlerFile

 

DownloadHandlerFile은 서버의 응답을 직접 파일로 저장합니다. 이는 대용량 데이터나 파일을 다운로드할 때 유용합니다. 다운로드 과정에서 메모리 사용량을 최소화할 수 있습니다.

 

using UnityEngine;
using UnityEngine.Networking;

public class DownloadFileExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Download());
    }

    IEnumerator Download()
    {
        string filePath = "path/to/save/the/file.txt";
        UnityWebRequest www = new UnityWebRequest("http://www.your-server.com/file", UnityWebRequest.kHttpVerbGET);
        www.downloadHandler = new DownloadHandlerFile(filePath);

        yield return www.SendWebRequest();

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

 


4.3 DownloadHandlerAssetBundle

 

DownloadHandlerAssetBundle은 애셋 번들을 다운로드하고, 애셋 번들로부터 애셋을 로드할 때 사용됩니다. 애셋 번들은 여러 애셋을 묶어 놓은 컨테이너로, 게임 리소스를 효율적으로 관리할 수 있게 해줍니다.

 

using UnityEngine;
using UnityEngine.Networking;

public class DownloadAssetBundleExample : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Download());
    }

    IEnumerator Download()
    {
        string bundleUrl = "http://www.your-server.com/assetbundle";
        UnityWebRequest www = UnityWebRequestAssetBundle.GetAssetBundle(bundleUrl);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.Log(www.error);
        }
        else
        {
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(www);
            // 애셋 번들에서 애셋 로드하기
            // 예: bundle.LoadAsset<GameObject>("MyAsset");
        }
    }
}

 


5. UnityWebRequest의 작업 흐름

 

클라이언트 설정(Create/Configure) : UnityWebRequest 인스턴스를 생성하고, GET이나 POST 등의 HTTP 메서드를 설정합니다. 필요한 경우 요청 헤더를 추가하고, UploadHandler를 통해 전송할 데이터를 구성합니다.

전송(Send/Abort) : 구성된 요청을 서버로 전송합니다. 전송 과정은 비동기적으로 진행되므로, 게임의 메인 루프에 영향을 주지 않습니다. 전송 중에 요청을 중단할 수도 있습니다.

처리(Receive/Buffer/Process) : 서버로부터의 응답을 받습니다. DownloadHandler를 사용하여 서버의 응답을 적절한 형태로 처리합니다.

완료 : 모든 통신 과정이 완료되면, UnityWebRequest 객체는 사용한 자원을 해제하고, 결과를 반환합니다.