前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >封装Unity的网络请求中常用功能

封装Unity的网络请求中常用功能

作者头像
bering
发布2019-12-03 11:32:05
1.5K0
发布2019-12-03 11:32:05
举报
文章被收录于专栏:游戏开发之旅游戏开发之旅

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

public class WebManager : MonoBehaviour
    {
        
        # region 单例模式控制web请求相关
        private static WebManager _mgr = null;
        float startTime = 0;
        public static WebManager _instance
        {
            get
            {
                if (_mgr == null)
                {
                    GameObject mgrGo = new GameObject("WebManager");
                    _mgr = mgrGo.AddComponent<WebManager>();
                }
                return _mgr;
            }

            set
            {
                _mgr = value;
            }
        }
        #endregion


        //UnityWebRequest请求方式   common
        public void SendRequest(string url,byte[]postData,Dictionary<string,string> headerDic,Action<UnityWebRequest> callback)
        {
            startTime = Time.realtimeSinceStartup;
            StartCoroutine(CoroutineRequest(AppConst.BaseUrl+url, postData, headerDic, callback));
        }
        //postData为空的时候是Get请求,反之则为Post请求
        IEnumerator CoroutineRequest(string url, byte[] postData, Dictionary<string, string> headerDic, Action<UnityWebRequest> callback)
        {
            var verb = postData == null ? UnityWebRequest.kHttpVerbGET : UnityWebRequest.kHttpVerbPOST;
            UnityWebRequest uwr = new UnityWebRequest(url,verb);
            uwr.chunkedTransfer = false;
            UploadHandler formUploadHandler = new UploadHandlerRaw(postData);
            formUploadHandler.contentType = "application/json";
            uwr.uploadHandler = formUploadHandler;
            uwr.downloadHandler = new DownloadHandlerBuffer();
            foreach (var header in headerDic)
            {
                uwr.SetRequestHeader(header.Key,header.Value);
            }
            yield return uwr.SendWebRequest();
            CommonMethod(uwr,callback);
          
        }

        #region 分开的 get Post 请求
        #region get  请求 获取字符串类型
        public void SendGetRquest(string url, Dictionary<string, string> headerDic, Action<UnityWebRequest> callBack)
        {

            StartCoroutine(GetRequest(AppConst.BaseUrl+ url, headerDic, callBack));

        }
        private IEnumerator GetRequest(string url, Dictionary<string, string> headerDic, Action<UnityWebRequest> callback)
        {
            using (UnityWebRequest uwr = UnityWebRequest.Get(url))
            {
                foreach (var key in headerDic.Keys)
                {
                    uwr.SetRequestHeader(key, headerDic[key]);
                }
                yield return uwr.SendWebRequest();
                CommonMethod(uwr, callback);
            }
        }
        #endregion
        #region Post请求方式

        public void SendPostRequest(string url, WWWForm form, Dictionary<string, string> headerDic, Action<UnityWebRequest> callback)
        {
            StartCoroutine(PostRequest(AppConst.BaseUrl + url, form, headerDic, callback));
        }
        IEnumerator PostRequest(string url, WWWForm form, Dictionary<string, string> headerDic, Action<UnityWebRequest> callback)
        {
            UnityWebRequest uwr = UnityWebRequest.Post(url, form);
            foreach (var key in headerDic.Keys)
            {
                uwr.SetRequestHeader(key, headerDic[key]);
            }
            yield return uwr.SendWebRequest();
            CommonMethod(uwr, callback);

        }

        #endregion
        #endregion


        #region 获取Texture
        public void RequestTexture(string url, Action<Texture2D> callback)
        {
            startTime = Time.realtimeSinceStartup;
            StartCoroutine(GetTexture(url, callback));
        }
        IEnumerator GetTexture(string url, Action<Texture2D> callback)
        {
            UnityWebRequest uwr =UnityWebRequest.Get(url);
            DownloadHandlerTexture downloadTexture = new DownloadHandlerTexture(true);
            uwr.downloadHandler = downloadTexture;
            yield return uwr.SendWebRequest();
            Texture2D t = null;
            if (!(uwr.isNetworkError || uwr.isHttpError))
            {
                t = downloadTexture.texture;
            }
            else
            {
                Debug.Log("download Texture Error");
            }

            if (callback != null)
             {
                Debug.Log("请求消耗时间:" + (Time.realtimeSinceStartup - startTime));
                callback(t);
            }
           
          
        }
        #endregion

        #region 获取视频

        //public void RequestVideo(string url,Action<MovieTexture> callback)
        //{
        //    StartCoroutine(GetVideo(baseUrl+url, callback));
        //}
        //IEnumerator GetVideo(string url,Action<MovieTexture> callbcak)
        //{
        //    using(var uwr= UnityWebRequestMultimedia.GetMovieTexture(url))
        //    {
        //        yield return uwr.SendWebRequest();
        //        if(!(uwr.isNetworkError||uwr.isHttpError))
        //        {
        //            if(callbcak!=null)
        //            {
        //                callbcak(DownloadHandlerMovieTexture.GetContent(uwr));
        //            }
        //        }
        //    }
        //}
        #endregion
        #region 获取音频
        public void RequestAudio(string url, Action<AudioClip> callback, AudioType audioType = AudioType.WAV)
        {
            StartCoroutine(GetAudioClip(AppConst.BaseUrl + url, callback, audioType));
        }
        IEnumerator GetAudioClip(string url, Action<AudioClip> callback, AudioType audioType = AudioType.WAV)
        {
            using (var uwr = UnityWebRequestMultimedia.GetAudioClip(url, audioType))
            {
                yield return uwr.SendWebRequest();
                if (!(uwr.isNetworkError || uwr.isHttpError))
                {
                    if (callback != null)
                    {
                        callback(DownloadHandlerAudioClip.GetContent(uwr));
                    }
                }
            }
        }
        #endregion

      

        #region 下载AssetBundle 

        public void RequestAB(string url,Action<AssetBundle> callbcak)
        {
            StartCoroutine(GetAssetBundle(AppConst.BaseUrl + url, callbcak));
        }
        IEnumerator GetAssetBundle(string url, Action<AssetBundle> callbcak)
        {
            UnityWebRequest request = new UnityWebRequest(url);
            DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(request.url, uint.MaxValue);
            request.downloadHandler = handler;
            yield return request.SendWebRequest();
            if (!(request.isHttpError || request.isNetworkError))
            {
                if (callbcak != null)
                {
                    callbcak(handler.assetBundle);
                }
            }
        }

        #endregion

        #region  文件上传相关

        public void UploadFile(string url, byte[] contentBytes, Action<bool> callback)
        {
            StartCoroutine(UploadByPut(AppConst.BaseUrl + url, contentBytes, callback));
        }
        // 可以结合WebUtility中的Formatter方法将对象转化为byte数组传递给服务端
        IEnumerator UploadByPut(string url, byte[] contentBytes, Action<bool> callback, string contentType = "application/octet-stream")
        {
            UnityWebRequest uwr = new UnityWebRequest(url);
            UploadHandler uploader = new UploadHandlerRaw(contentBytes);
            uploader.contentType = contentType;

            uwr.uploadHandler = uploader;

            yield return uwr.SendWebRequest();

            bool isUploadSuccess = true;
            if (uwr.isNetworkError || uwr.isHttpError)
            {
                isUploadSuccess = false;
            }
            if (callback != null)
            {
                callback(isUploadSuccess);  //isUploadSuccess参数表示是否上传成功
            }
        }
        #endregion


        //HttpWebRequest Get请求
        public void HttpRequest(string url,Action<string> callback)
        {
            startTime = Time.realtimeSinceStartup;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(AppConst.BaseUrl + url);
            request.Method = "GET";
            request.ContentType = "application/json";
            request.UserAgent = null;
            request.Timeout = 10000; //这里设置了十秒超时时间
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream= response.GetResponseStream();
            StreamReader streamReader = new StreamReader(resStream, Encoding.UTF8);
            string readerStr = streamReader.ReadToEnd();
            streamReader.Close();
            resStream.Close();
            if(callback!=null)
            {
                Debug.Log("请求消耗时间:"+(Time.realtimeSinceStartup- startTime));
                callback(readerStr);
            }
        }

        //HttpWebRequest Post请求
        public void HttpRequest(string url,string postData,Dictionary<string,string> headerDic,Action<string> callback)
        {
            startTime = Time.realtimeSinceStartup;
            byte[] data = Encoding.UTF8.GetBytes(postData);

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(AppConst.BaseUrl + url);
            request.Method = "POST";
            request.ContentType = "application/json";
            request.UserAgent = null;
            request.Timeout = 100000; //这里设置了十秒超时时间
            foreach (var key in headerDic.Keys)
            {
                request.Headers.Add(key, headerDic[key]);
            }

            request.ContentLength = data.Length;

            using (Stream newStream = request.GetRequestStream())
            {
                //// Send the data.
                newStream.Write(data, 0, data.Length);
            }

            // Get response
            HttpWebResponse myResponse = (HttpWebResponse)request.GetResponse();
            StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
            string content = reader.ReadToEnd();
            if(callback!=null)
            {
                Debug.Log("请求消耗时间:" + (Time.realtimeSinceStartup - startTime));
                callback(content);
            }
        }
        void CommonMethod(UnityWebRequest uwr, Action<UnityWebRequest> callback)
        {
            switch (uwr.responseCode)
            {
                case 200:
                   if(callback!=null)
                    {
                        callback(uwr);
                    }
                    break;
                case 404:
                default:
                    //此处UI提示
                    //{"timestamp":1562662472679,"status":404,"error":"Not Found","message":"No message available","path":"/game/v1/user/%7B2175b2265eb37c3242c1ed258839b650%7D/login"}
                    Debug.Log("404 Not Found");
                    UIManager.HideAll();
                    UIManager.Show("UILoading");
                    break;
            }
        }
       
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档