千家信息网

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

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,小编给大家分享一下Unity3D网络通讯中HttpRestful请求如何封装,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!整理代码脚本我们在Scripts下建了一个Model的文件夹
千家信息网最后更新 2025年02月02日Unity3D网络通讯中HttpRestful请求如何封装

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

整理代码脚本

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

02

HttpRestful封装


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

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

外部调用的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(); } return _instance; } }
#region Get请求 /// /// Get请求 /// /// /// public void Get(string url, Action actionResult = null) { StartCoroutine(_Get(url, actionResult)); }
private IEnumerator _Get(string url, Action 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 actionResult = null) { StartCoroutine(_Post(url, data, actionResult)); }
private IEnumerator _Post(string url, string data, Action 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


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

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

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

然后我们在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 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); }); }
/// /// 写返回Action的处理方法 /// private void InitAction() { actionRes = new Action((bl, str) => { if (bl) { txtshow.text = str; } else { string resjson = "{\"array\":" + str + "}"; txtshow.text = resjson; WeatherData lists = JsonUtility.FromJson(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(json); string showtext = "Summary:" + newitem.Summary + " Date:" + newitem.Date + " C:" + newitem.TemperatureC + " F:" + newitem.TemperatureF; txtshow.text = showtext; }}

实现效果

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

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

0