UnityWebRequest是新的網絡請求Api,分為LLApi和HLApi,其中LLApi為低級api,所謂低級api是指只是提供最基本的api接口,然后需要通過不同的參數來確定請求方式。為此unity提供了高級api(HLApi)即對不同的功能進行了封裝,以下基於HLApi做了簡單封裝。
using System.Collections; using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; using System.Collections.Generic; using System.IO; public class WebRequestUtility : MonoBehaviour { public static WebRequestUtility Instance; enum RequestType { TEXT_GET, TEXTUREE_GET, ASSETBUNDEL, POST } public void Get(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url,action,RequestType.TEXT_GET)); } public void GetTexture(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url, action, RequestType.TEXTUREE_GET)); } public void GetAssetBundle(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url, action, RequestType.ASSETBUNDEL)); } public void Post(string url, Action<UnityWebRequest> action, List<IMultipartFormSection> formData) { StartCoroutine(Request(url, action, RequestType.POST, formData)); } IEnumerator Request(string url,Action<UnityWebRequest> action,RequestType type, List<IMultipartFormSection> formData=null) { UnityWebRequest webRequest = null; switch (type) { case RequestType.TEXT_GET: webRequest = UnityWebRequest.Get(url); break; case RequestType.TEXTUREE_GET: webRequest = UnityWebRequestTexture.GetTexture(url); break; case RequestType.ASSETBUNDEL: webRequest = UnityWebRequestAssetBundle.GetAssetBundle(url); break; case RequestType.POST: webRequest = UnityWebRequest.Post(url, formData); break; default: break; } if(webRequest==null) { Debug.Log("WebRequest initialise error"); yield break; } yield return webRequest.SendWebRequest(); action?.Invoke(webRequest); webRequest.Dispose(); webRequest = null; Resources.UnloadUnusedAssets(); } private void Awake() { Instance = this; } }
調用Get方法
Get(texUrlGet, OnGetAction); //OnGetAction回調 void OnGetAction(UnityWebRequest webRequest) { if(webRequest.isHttpError || webRequest.isNetworkError) { Debug.Log("WebRequest error:"+webRequest.error); return; } //下載文本 Debug.Log(webRequest.downloadHandler.text); //下載圖片 Texture2D t2d = new Texture2D(10, 10); t2d.LoadImage(webRequest.downloadHandler.data); rawImage.texture = t2d; }
調用Get方法只獲取圖片
GetTexture(texUrlGet, OnGetTextueAction); void OnGetTextueAction(UnityWebRequest webRequest) { if (webRequest.isHttpError || webRequest.isNetworkError) { Debug.Log("WebRequest error:" + webRequest.error); return; } DownloadHandlerTexture texHandler = (DownloadHandlerTexture)webRequest.downloadHandler; rawImage.texture = ((DownloadHandlerTexture)webRequest.downloadHandler).texture; }
post方法
string headPath = @"D:\zzh.png"; byte[] bytes = File.ReadAllBytes(headPath); List<IMultipartFormSection> formData = new List<IMultipartFormSection>(); formData.Add(new MultipartFormDataSection("api_key", "**********************")); formData.Add(new MultipartFormDataSection("api_secret", "***************************")); //formData.Add(new MultipartFormDataSection("image_url", texUrlGet)); formData.Add(new MultipartFormFileSection("image_file", bytes, "zzh.png", "application/octet-stream")); Post("https://api-cn.faceplusplus.com/facepp/v3/detect", OnPostAction, formData);
void OnPostAction(UnityWebRequest webRequest) { if (webRequest.isHttpError || webRequest.isNetworkError) { Debug.Log("WebRequest error:" + webRequest.error); return; } //下載文本 Debug.Log(webRequest.downloadHandler.text); }
//---------------------------------2018-1026------------------------------------------//更新
在post請求時根據需求分為四種模式,詳細見https://www.cnblogs.com/llstart-new0201/p/6825058.html;所以此次更新增加了post模式,但新加的並未進行測試
using System.Collections; using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; using System.Collections.Generic; using System.IO; public class WebRequestUtility : MonoBehaviour { public RawImage rawImage; public static WebRequestUtility Instance; enum RequestType { TEXT_GET, TEXTUREE_GET, ASSETBUNDEL, POST_FORM, POST_URLENCODED, POST_JSON, POST_XML } class PostContent { public WWWForm formData; public string stringContent; public PostContent(WWWForm formData) { this.formData = formData; } public PostContent(string text) { this.stringContent = text; } } public void Get(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url,action,RequestType.TEXT_GET)); } public void GetTexture(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url, action, RequestType.TEXTUREE_GET)); } public void GetAssetBundle(string url,Action<UnityWebRequest> action) { StartCoroutine(Request(url, action, RequestType.ASSETBUNDEL)); } public void Post(string url, Action<UnityWebRequest> action, WWWForm formData) { StartCoroutine(Request(url, action, RequestType.POST_FORM, new PostContent(formData))); } public void PostUrlEncoded(string url,Action<UnityWebRequest> action,string json) { StartCoroutine(Request(url, action, RequestType.POST_URLENCODED,new PostContent(json))); } public void PostJson(string url, Action<UnityWebRequest> action, string json) { StartCoroutine(Request(url, action, RequestType.POST_JSON, new PostContent(json))); } public void PostXml(string url, Action<UnityWebRequest> action, string json) { StartCoroutine(Request(url, action, RequestType.POST_XML, new PostContent(json))); } IEnumerator Request(string url,Action<UnityWebRequest> action,RequestType type, PostContent postContent =null) { UnityWebRequest webRequest = null; switch (type) { case RequestType.TEXT_GET: webRequest = UnityWebRequest.Get(url); break; case RequestType.TEXTUREE_GET: webRequest = UnityWebRequestTexture.GetTexture(url); break; case RequestType.ASSETBUNDEL: webRequest = UnityWebRequestAssetBundle.GetAssetBundle(url); break; case RequestType.POST_FORM: webRequest = UnityWebRequest.Post(url, postContent.formData); break; case RequestType.POST_URLENCODED: webRequest = UnityWebRequest.Post(url, postContent.stringContent); //可以不進行設置,此時默認為urlencoded webRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded"); break; case RequestType.POST_JSON: webRequest = UnityWebRequest.Post(url, postContent.stringContent); webRequest.SetRequestHeader("Content-Type", "application/json"); break; case RequestType.POST_XML: webRequest = UnityWebRequest.Post(url, postContent.stringContent); webRequest.SetRequestHeader("Content-Type", "text/xml");//注:text/plain為純文本 break; default: break; } if(webRequest==null) { Debug.Log("WebRequest initialise error"); yield break; } yield return webRequest.SendWebRequest(); action?.Invoke(webRequest); action = null; webRequest.Dispose(); webRequest = null; Resources.UnloadUnusedAssets(); } private void Awake() { Instance = this; } }
鑒於post請求可能存在的問題,如https://www.jianshu.com/p/0f1f24829db3所述,做如下代碼,
//通過PUT方式構造HTTP請求 byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data"); UnityWebRequest www = UnityWebRequest.Put("http://www.my-server.com/upload", myData); //構造好后,手動將請求方式更改為POST www.method = UnityWebRequest.kHttpVerbPOST; //常規的發送,接收操作 yield return www.Send(); if(www.isError) { Debug.Log(www.error); } else { Debug.Log("Upload complete!"); }
unityWebRequest LLAPI
public IEnumerator PostUrl(string url, string postData) { using (UnityWebRequest www = new UnityWebRequest(url,"POST")) { byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postData); www.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes); www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); www.SetRequestHeader("Content-Type", "application/json"); yield return www.Send(); if (www.isError) { Debug.Log(www.error); } else { // Show results as text if (www.responseCode == 200) { Debug.Log(www.downloadHandler.text); } } } }