본문 바로가기
게임 개발/Unity3D

[Unity | 유니티] WWW 호출 인터페이스 작성

by 불타는홍당무 2018. 3. 4.

서버 통신을 위한 WWW 호출 인터페이스를 작성해보자.

필요한 클래스에 매번 함수를 작성하는 것보단 인터페이스를 만들고 상속해서 사용하는 것이 편리하다. GET과 POST용 함수를 따로 작성했는데 POST를 이용한 통신에서는 form에 필요한 데이터를 넣어주는 로직이 추가 되었다. 

응답으로 받은 데이터를 어떻게 파싱할 것인지(parser), 호출 성공시 어떤 콜백을 실행할 것인지(onSuccess), 호출 실패 시 어떤 콜백을 실행할 것인지(onFailure) 매번 지정할 수 있으며, 따라서 깔끔하고 가독성 높은 코드 작성이 가능해진다.


    public void GET<T>(string url, Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure)
    {
        StartCoroutine(GETImpl(url, parser, onSuccess, onFailure));
    }

    public IEnumerator GETImpl<T>(string url, Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure)
    {
        var www = new WWW(url);
        yield return www;
        if (null == www.error)
        {
            var parsedResult = parser(www.text);
            onSuccess(parsedResult);
        }
        else
        {
            onFailure("WWW Call Error.");
        }
    }
    public void POST<T>(string url, Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure, Dictionary<string, string> post)
    {
        StartCoroutine(POSTImpl(url, parser, onSuccess, onFailure, post));
    }
    public IEnumerator POSTImpl<T>(string url, Func<string, T> parser, Action<T> onSuccess, Action<string> onFailure, Dictionary<string, string> post)
    {
        WWWForm form = new WWWForm();
        foreach (KeyValuePair<String, String> post_arg in post)
        {
            form.AddField(post_arg.Key, post_arg.Value);
        }
        var www = new WWW(url, form);
        yield return www;
        if (null == www.error)
        {
            var parsedResult = parser(www.text);
            onSuccess(parsedResult);
        }
        else
        {
            onFailure("WWW Call Error");
        }
    }