
유니티를 사용하다가 보면
게임쪽에 있든 산업쪽에 있든, 혹은...
어느 분야에 있든 간에..
Restful API를 적용하여
Backend 서버와 통신을 해야할 일이 있다.
나의 경우 매우 자주 사용하기에 원래는 회사에서 만들어져 있는 것을
사용하였지만..
회사에 있던 모듈을 조금 배껴서 단순화하여 사용한 모듈을 설명하려한다.
참고로 NewtonSoft.json을 사용..
https://github.com/ym7596/Unity_Template_SimpleRestAPI
GitHub - ym7596/Unity_Template_SimpleRestAPI: 기본 통신모듈 유니티 RestAPI용
기본 통신모듈 유니티 RestAPI용. Contribute to ym7596/Unity_Template_SimpleRestAPI development by creating an account on GitHub.
github.com
Rest 작성에 앞서 간단한게 설명을 하자면..
4단계로 요약을 할 수 있다.
1. 패킷만들기
Get, Post등의 요청을 하기 전
header / Body 내용을 추가하는 과정이다.
서버에서 정한 양식 그대로 보내야하니 주의할것..
2. 요청하기 (Request)
Get/Post/Put등의 요청을 실제로 하는 부분
3. 요청받기 (Response)
요청 후 실패/성공 여부를 받고 성공시
응답을 받는 부분이다.
4. Deserialize
응답을 받은 json을 이제
우리가 사용하게끔 클래스화 혹은 데이터화 하는 것이다.
중간에 json의 직렬화등의 과정등이 있긴 하지만..
여기서 설명하지는 않도록 하겠다..
WebPacket.cs
public class WebPacket : IWebPacket
{
public string Url { get; }
public string Authorization { get; set; }
public Dictionary<string, string> Headers { get; private set; } = new Dictionary<string, string>();
public DownloadHandler downloadHandler { get; protected set; }
public WebPacket(string url, string authorizationToken = "")
{
Url = url;
SetAuthToken(authorizationToken);
SetHeadersDefault();
}
public void SetAuthToken(string token)
{
if (string.IsNullOrEmpty(token))
return;
Authorization = token;
Headers.Add("Authorization",token);
}
private void SetHeadersDefault()
{
Headers.Add("Content-Type","application/json");
}
public virtual JArray DeserializeArray()
{
var json = downloadHandler?.text;
return string.IsNullOrEmpty(json) ? null : JArray.Parse(json);
}
public virtual T Deserialize<T>()
{
var json = downloadHandler?.text;
return string.IsNullOrEmpty(json) ? default : JsonConvert.DeserializeObject<T>(json);
}
public virtual JObject Deserialize()
{
var json = downloadHandler?.text;
return string.IsNullOrEmpty(json) ? null : JObject.Parse(json);
}
public void SetDownHandler(DownloadHandler handler)
{
downloadHandler = handler;
}
}
기본적인 webpacket을 만드는 스크립트이다.
추가 헤더를 넣는 함수는 없긴한데
템플릿이므로 난 public으로 딕셔너리를 선언하고
그냥 보낼때마다 추가하는 방식을 사용하였다.
T를 이용하여 제너릭 으로 클래스로 바로 변환도 되게 만들긴 햇는데
이 부분은 override해도 될 듯 하다.
패킷안에 Deserilize 함수를 만들어서
응답을 받고 바로 데이터화를 할 수 있게 만들었다.
패킷을 보내는 Request쪽을 보자
ProtocolRest.cs 中 Get부분
public virtual IEnumerator Get(WebPacket packet, Action<WebRequestResult, JObject> onComplete)
{
yield return RequestBufferCo(ProtocolMethod.Get, packet, null,
(result, buffer) =>
{
WebRequestResult reqResult;
JObject data = null;
packet.SetDownHandler(buffer);
if (result == UnityWebRequest.Result.Success)
{
data = packet.Deserialize();
onComplete?.Invoke(WebRequestResult.Success, data);
}
else
{
//get error
data = default;
Debug.Log($"Protocol Error : {result.ToString()}");
}
});
}
protected IEnumerator RequestBufferCo(ProtocolMethod method, WebPacket packet,
string body,
Action<UnityWebRequest.Result, DownloadHandlerBuffer> onComplete)
{
if (packet == null)
yield break;
var url = packet.Url;
var headers = packet.Headers;
using var req = new UnityWebRequest(url, method.ToString());
switch (method)
{
case ProtocolMethod.Post:
case ProtocolMethod.Put:
{
SetBody(req, body);
break;
}
}
SetHeaders(req, headers);
req.downloadHandler = new DownloadHandlerBuffer();
yield return req.SendWebRequest();
DownloadHandlerBuffer downloadHandler = null;
if (req.result == UnityWebRequest.Result.Success)
downloadHandler = (DownloadHandlerBuffer)req.downloadHandler;
onComplete?.Invoke(req.result, downloadHandler);
}
Get과 Post 등 Web요청을 할 수 있는 함수와 엮었다.
위에서는 Get만 예시로 적었지만..
Post와 Put도 마찬가지이다.
그래서 위의 샘플들을 활용하여 데모를 보면..
public void Test()
{
var url = endPoint.urlDatas.Find(x =>
x.type == EndPointType.Test).url;
//그냥 url을 뽑는건데 SO로 만들어둔 샘플이 있음..
WebPacket packet = new WebPacket(url);
// packet.SetAuthToken(endPoint.authToken);
StartCoroutine(TestCo(packet));
}
private IEnumerator TestCo(WebPacket pk)
{
yield return _protocolRest.Get(pk, (result, obj) =>
{
if (result == WebRequestResult.Success)
{
Debug.Log(obj);
}
});
}
이런식으로 활용할 수 있다.
깃 주소를 남겼으니 ㅎㅎ 궁금한 부분은 댓글로..
'프로그래밍 > Unity' 카테고리의 다른 글
[유니티] Unity WebGL - React.js와 쌍방향 통신하기 (2) | 2024.12.11 |
---|---|
[유니티] Unity - NewInputSystem 새로운 인풋시스템 적용하기. (0) | 2024.12.10 |
유니티 3D - 인공지능 AI (스크립트) (1) | 2017.12.09 |
유니티 Unity - Curved UI 휘어진 UI 에셋 구매후기. (0) | 2017.12.06 |
유니티 VR - 점수 UI 만들기 (0) | 2017.11.27 |