티스토리 뷰
Unity 가지고 AWS S3에서 받아온 presigned URL로 업로드하는데, 문제 발생!
Unity 에서 기본으로 제공하는 WWW 개체는 POST, GET 만 할 수 있다. PUT 불가!!
https://docs.unity3d.com/ScriptReference/WWW.html
뭐 이런 것이 다 있어 싶지만...
물론 PUT 안 쓰고도, 아니면, S3 의 REST API 를 이용해도 된다.
혹은 아래처럼 POST 로 PUT 대신 쓸 방법도 있긴하단다.
http://answers.unity3d.com/questions/785798/put-with-wwwform.html
var headers = new Dictionary<string, string>();
headers.Add("X-HTTP-Method-Override", "PUT");
var request = new UnityEngine.WWW(_uri, _putBytes, headers);
yield return request;
Debug.Log(request.text);
잘 되나? 테스트할 때에 헤더 파라미터 문제로 잘 안되어 시그니처가 맞지 않는다 했다. -_-;
더 알아보기 싫었다.
일단, 쓸데없이 헤더가 많이 붙어서 싫고...
유니티에선 한계가 좀 많군. HTTP 프로토콜상 별 것 없는 건데 왜 안되나?!
어쨌든 나는 PUT을 쓰고 싶으니...
잘 안되나? 헤더쪽에 문제인데 귀찮다. 일단 PUT을 알아보고 싶다.
http://stackoverflow.com/questions/29668059/unity-use-http-put-in-unity3d
위에거랑 같은 답변이 나오는데, 좀 더 내려 보면, 이유도 나온다.
.Net 의 오픈소스 버전이라 할 수 있는 Mono 플랫폼이 2.0 이라 지원을 못한단다. 그럼 다른 것을 써보자.
HTTP 클라이언트 라이브러리를 만들수도 있지만, 너무 귀찮다.
그래 뭔가 추가 안하고서 할 수 있는 것을 찾자.
http://blog.naver.com/PostView.nhn?blogId=sonmg&logNo=220510568356
[출처] [Unity3d] Http (GET, POST, PUT, DELETE) example|작성자 슈퍼베리코더
...
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "PUT";
HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
string responseText = streamReader.ReadToEnd();
Debug.Log(responseText);
}
...
PUT은 되지만, HTTPS 에서는 오동작한다.
문제는 HTTPS 인증서의 신뢰 문제 때문인데, 다음과 같은 방법으로 대략 해결할 수 있긴 하다.
http://lhh3520.tistory.com/318
위에 내용인즉, 내가 접속할 서버의 인증서를 신뢰하는 인증서로 직접 등록하겠다는 것인데, 깨림직하니까 아래처럼 푸는 것이 좋겠다.
http://stackoverflow.com/questions/12224602/a-method-for-making-http-requests-on-unity-ios
public bool MyRemoteCertificateValidationCallback(System.Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
bool isOk = true;
// If there are errors in the certificate chain, look at each error to determine the cause.
if (sslPolicyErrors != SslPolicyErrors.None) {
for (int i=0; i<chain.ChainStatus.Length; i++) {
if (chain.ChainStatus [i].Status != X509ChainStatusFlags.RevocationStatusUnknown) {
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online;
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan (0, 1, 0);
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
bool chainIsValid = chain.Build ((X509Certificate2)certificate);
if (!chainIsValid) {
isOk = false;
}
}
}
}
return isOk;
}
void Start()
{
...
ServicePointManager.ServerCertificateValidationCallback = MyRemoteCertificateValidationCallback;
...
}
이런 문제를 유니티쪽에서도 알고, UnityWebRequest를 내 놓았으니(진작 내놓지...)
https://docs.unity3d.com/Manual/UnityWebRequest.html
위에 문서를 보니
Supported Platforms
The UnityWebRequest system supports most Unity platforms.
Platforms supported in 5.2:
All versions of the Editor & Standalone players
WebGL
Platforms supported in 5.3:
Mobile Platforms: iOS, Android, Windows Phone 8
Windows Store Apps
PS3
Xbox 360
Additional platform support will be rolled out in further 5.x releases:
PS4, PS Vita, and PS Mobile
Xbox One
Wii U
이 게시물 올리는 지금은 숫자상으로 5.4 는 넘었으니, 결국 모든 플렛폼을 다 지원한다는 이야기겠지?
일단 끝? 어떻게 사용하지.
메뉴얼은 위에 있으니까, 다른 사용예도 살펴볼까?
http://blog.applibot.co.jp/blog/2016/07/20/unity-webrequest/
잘 설명했네~ 메뉴얼 번역이니...
http://qiita.com/mattak/items/d01926bc57f8ab1f569a
이건 뭐 그냥...
2016년 7월 20일이라고, 그런데 찾아보니 우리나라 것은 잘 안보이네?!
요기 하나 있긴하다.
http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&no=4324
과거 자료는 많은데 최신 자료가 없구나...
혹시나 굳이 이런 것을 사용하기 싫다면, HTTP라이브러리도 여럿 있는듯 하다.
https://github.com/andyburke/UnityHTTP
위에서 여러번 언급된 상용 라이브러리도 있다.
https://www.assetstore.unity3d.com/en/#!/content/10872
누군가는 더 유익하게 시간을 보낼 수 있기를...