温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Unity3D网络通讯中HttpRestful请求如何封装

发布时间:2021-12-04 15:24:55 来源:亿速云 阅读:382 作者:小新 栏目:大数据

小编给大家分享一下Unity3D网络通讯中HttpRestful请求如何封装,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

整理代码脚本

Unity3D网络通讯中HttpRestful请求如何封装

我们在Scripts下建了一个Model的文件夹(存放对象类)和一个Utils的文件夹(存放工具类),然后把WeatherForecase类移动到Model下,在Utils文件夹下再创建一个Network的文件夹,用于处理网络通讯,然后在这文件夹下创建一个HttpRestful的C#脚本。  

02

HttpRestful封装


Unity3D网络通讯中HttpRestful请求如何封装

定义一个静态实例,然后写对应的实例方法获取方法。  

Unity3D网络通讯中HttpRestful请求如何封装

写Get的协程方法调用,其中最后一个参数就是Action<bool, string>的方法,其中Action的第一个参数bool,用于返回通讯的成功或失败,第二个参数string是返回的通讯信息。  

Unity3D网络通讯中HttpRestful请求如何封装

外部调用的Get方法传入的参数一样,内部是直接开户协程操作,下面的Post的实现也是按这个思路来写,只不过传入的参数里要加入一个我们传入的数据即可。  

HttpRestful完整代码

using System;using System.Collections;using System.Collections.Generic;using System.Text;using UnityEngine;using UnityEngine.Networking;
public class HttpRestful : MonoBehaviour{    private static HttpRestful _instance;
   public static HttpRestful Instance    {        get        {            if(_instance == null)            {                GameObject goRestful = new GameObject("HttpRestful");                _instance = goRestful.AddComponent<HttpRestful>();            }            return _instance;        }    }
   #region Get请求    /// <summary>    /// Get请求    /// </summary>    /// <param name="url"></param>    /// <param name="actionResult"></param>    public void Get(string url, Action<bool, string> actionResult = null)    {        StartCoroutine(_Get(url, actionResult));    }
   private IEnumerator _Get(string url, Action<bool, string> action)    {        using (UnityWebRequest request = UnityWebRequest.Get(url))        {            yield return request.SendWebRequest();
           string resstr = "";            if (request.isNetworkError || request.isHttpError)            {                resstr = request.error;            }            else            {                resstr = request.downloadHandler.text;            }
           if (action != null)            {                action(request.isHttpError, resstr);            }        }    }    #endregion

   #region POST请求    public void Post(string url, string data, Action<bool, string> actionResult = null)    {        StartCoroutine(_Post(url, data, actionResult));    }
   private IEnumerator _Post(string url, string data, Action<bool, string> action)    {        using (UnityWebRequest request = new UnityWebRequest(url, "POST"))        {            request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(data));            request.SetRequestHeader("content-type", "application/json;charset=utf-8");            request.downloadHandler = new DownloadHandlerBuffer();
           yield return request.SendWebRequest();
           string resstr = "";            if (request.isNetworkError || request.isHttpError)            {                resstr = request.error;            }            else            {                resstr = request.downloadHandler.text;            }
           if (action != null)            {                action(request.isHttpError, resstr);            }        }    }    #endregion}


03

调用HttpRestful


Unity3D网络通讯中HttpRestful请求如何封装

我们重新复制了一个UIScripts,然后其中一个名字后面加上了Old,这样就是不用再重新设置了,我们直接在UIScripts脚本中改造即可。  

Unity3D网络通讯中HttpRestful请求如何封装

首先定义一个Action<bool, string>,其中参数和HttpRestful里传入的Action方法是一样的。  

Unity3D网络通讯中HttpRestful请求如何封装

然后增加一个InitAction的方法,里面对定义的actionRes写其的实现方法。方法中就是判断通讯如果失败直接显示文本,成功后进行处理,再显示处理后的数据,因为Get和Post调用后返回的数据类型是一样的,这样我们这里写了一个Action都可以调用这个方法进行后面的数据处理。  

Unity3D网络通讯中HttpRestful请求如何封装

Unity3D网络通讯中HttpRestful请求如何封装

然后我们在Start里面首先把初始化Action进行调用,然后使用  
HttpRestful.Instance.Get(url, actionRes);HttpRestful.Instance.Post(url, json, actionRes);
就可以直接进行数据处理了,剩下的我们昨天调用的方法就可以都删除了。  

UIScipts完整代码

using System;using System.Collections;using System.Collections.Generic;using System.ComponentModel;using System.Linq;using System.Text;using UnityEngine;using UnityEngine.Networking;using UnityEngine.UI;
public class UIScripts : MonoBehaviour{    [Header("按钮")]    public Button btnget;    public Button btngetparm;    public Button btnjson;    public Button btnpost;
   [Space]    [Header("显示")]    public Text txtshow;
   [Space]    [Header("输入框")]    public InputField edturl;    public InputField edtparm;
   //定义一个返回数据的Action    private Action<bool, string> actionRes;    // Start is called before the first frame update    void Start()    {        InitAction();
       //Get按钮操作        btnget.onClick.AddListener(() =>        {            Debug.Log(edturl.text);            string url = edturl.text;            HttpRestful.Instance.Get(url, actionRes);        });        btngetparm.onClick.AddListener(() =>        {            string url = edturl.text;            string param = edtparm.text;
           string allurl = url + "/Info?Summary=" + param;            HttpRestful.Instance.Get(allurl, actionRes);        });
       btnjson.onClick.AddListener(() => StartCoroutine(JsonConvert()));
       btnpost.onClick.AddListener(() =>        {            WeatherForecast item = new WeatherForecast();            item.Summary = "Alvin";            item.Date = DateTime.Now;            item.TemperatureC = 10;            item.TemperatureF = 20;            string json = JsonUtility.ToJson(item);
           string url = edturl.text + "/Reg";            Debug.Log(url);            HttpRestful.Instance.Post(url, json, actionRes);        });    }
   /// <summary>    /// 写返回Action的处理方法    /// </summary>    private void InitAction()    {        actionRes = new Action<bool, string>((bl, str) =>        {            if (bl)            {                txtshow.text = str;            }            else            {                string resjson = "{\"array\":" + str + "}";                txtshow.text = resjson;                WeatherData lists = JsonUtility.FromJson<WeatherData>(resjson);                StringBuilder sb = new StringBuilder();                foreach (WeatherForecast item in lists.array)                {                    sb.Append("Date:" + item.Date + " Summary:" + item.Summary + " TemperatureF:"                        + item.TemperatureF + "TemperatureC:" + item.TemperatureC + "\r\n");                }                txtshow.text = sb.ToString();            }        });    }
   IEnumerator JsonConvert()    {        WeatherForecast item = new WeatherForecast();        item.Summary = "Alvin";        item.Date = DateTime.Now;        item.TemperatureC = 10;        item.TemperatureF = 20;
       string json = JsonUtility.ToJson(item);        txtshow.text = json;        yield return new WaitForSeconds(3f);
       WeatherForecast newitem = JsonUtility.FromJson<WeatherForecast>(json);        string showtext = "Summary:" + newitem.Summary + "  Date:" + newitem.Date +            "  C:" + newitem.TemperatureC + "  F:" + newitem.TemperatureF;        txtshow.text = showtext;    }}

实现效果

Unity3D网络通讯中HttpRestful请求如何封装

上图就是封装后调用WebApi的实现效果,后面我又在Android平台下进行了编译,调用也完全没有问题,这种方式可以跨平台使用的。    

看完了这篇文章,相信你对“Unity3D网络通讯中HttpRestful请求如何封装”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI