当前位置: 首页 > news >正文

Unity UnityWebRequest封装类

简化api调用流程,非常奈斯。

RestWebClient.cs

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;namespace MYTOOL.RestClient
{/// <summary>/// UnityWebRequest封装类/// </summary>public class RestWebClient{private readonly MonoBehaviour executer;public RestWebClient(MonoBehaviour executer){if (executer == null) throw new ArgumentNullException();this.executer = executer;}#region >> GETpublic Coroutine Get(string url, Request req){if (req == null) throw new ArgumentNullException();return executer.StartCoroutine(InnerGet(url, req));}#endregion#region >> PUTpublic Coroutine Put(string url, Request req){if (req == null) throw new ArgumentNullException();return executer.StartCoroutine(InnerPut(url, req));}#endregion#region >> POSTpublic Coroutine Post(string url, Request req){if (req == null) throw new ArgumentNullException();return executer.StartCoroutine(InnerPost(url, req));}public Coroutine PostForm(string url, WWWForm formData, Request req){if (req == null) throw new ArgumentNullException();return executer.StartCoroutine(InnerPostForm(url, formData, req));}#endregion#region >> DELETEpublic Coroutine Delete(string url, Request req){if (req == null) throw new ArgumentNullException();return executer.StartCoroutine(InnerDelete(url, req));}#endregionprivate IEnumerator InnerGet(string url, Request req){req.OnBegin?.Invoke();ushort retryCount = req.RetryCount;do{using UnityWebRequest webRequest = UnityWebRequest.Get(url);InitUnityWebRequest(webRequest, req);yield return webRequest.SendWebRequest();bool isSuccess = webRequest.result == UnityWebRequest.Result.Success;if (isSuccess || retryCount == 0){if (DebugMode) LogInfo("GET", webRequest.responseCode, isSuccess, webRequest.url);req.Invoke(isSuccess, webRequest.responseCode, webRequest.downloadHandler.data, webRequest.error);yield break;}if (req.RetryInterval > 0){yield return new WaitForSeconds(req.RetryInterval);}} while (retryCount-- > 0);}private IEnumerator InnerPut(string url, Request req){req.OnBegin?.Invoke();ushort retryCount = req.RetryCount;do{using UnityWebRequest webRequest = UnityWebRequest.Put(url, req.BodyData);InitUnityWebRequest(webRequest, req);yield return webRequest.SendWebRequest();bool isSuccess = webRequest.result == UnityWebRequest.Result.Success;if (isSuccess || retryCount == 0){if (DebugMode) LogInfo("PUT", webRequest.responseCode, isSuccess, webRequest.url);req.Invoke(isSuccess, webRequest.responseCode, webRequest.downloadHandler.data, webRequest.error);yield break;}if (req.RetryInterval > 0){yield return new WaitForSeconds(req.RetryInterval);}} while (retryCount-- > 0);}private IEnumerator InnerPost(string url, Request req){req.OnBegin?.Invoke();ushort retryCount = req.RetryCount;do{using UnityWebRequest webRequest = UnityWebRequest.Post(url, req.BodyData);InitUnityWebRequest(webRequest, req);yield return webRequest.SendWebRequest();bool isSuccess = webRequest.result == UnityWebRequest.Result.Success;if (isSuccess || retryCount == 0){if (DebugMode) LogInfo("POST", webRequest.responseCode, isSuccess, webRequest.url);req.Invoke(isSuccess, webRequest.responseCode, webRequest.downloadHandler.data, webRequest.error);yield break;}if (req.RetryInterval > 0){yield return new WaitForSeconds(req.RetryInterval);}} while (retryCount-- > 0);}private IEnumerator InnerPostForm(string url, WWWForm formData, Request req){req.OnBegin?.Invoke();ushort retryCount = req.RetryCount;do{using UnityWebRequest webRequest = UnityWebRequest.Post(url, formData);InitUnityWebRequest(webRequest, req);yield return webRequest.SendWebRequest();bool isSuccess = webRequest.result == UnityWebRequest.Result.Success;if (isSuccess || retryCount == 0){if (DebugMode) LogInfo("POST", webRequest.responseCode, isSuccess, webRequest.url);req.Invoke(isSuccess, webRequest.responseCode, webRequest.downloadHandler.data, webRequest.error);yield break;}if (req.RetryInterval > 0){yield return new WaitForSeconds(req.RetryInterval);}} while (retryCount-- > 0);}private IEnumerator InnerDelete(string url, Request req){req.OnBegin?.Invoke();ushort retryCount = req.RetryCount;do{using UnityWebRequest webRequest = UnityWebRequest.Delete(url);webRequest.downloadHandler = new DownloadHandlerBuffer();InitUnityWebRequest(webRequest, req);yield return webRequest.SendWebRequest();bool isSuccess = webRequest.result == UnityWebRequest.Result.Success;if (isSuccess || retryCount == 0){if (DebugMode) LogInfo("DELETE", webRequest.responseCode, isSuccess, webRequest.url);req.Invoke(isSuccess, webRequest.responseCode, webRequest.downloadHandler.data, webRequest.error);yield break;}if (req.RetryInterval > 0){yield return new WaitForSeconds(req.RetryInterval);}} while (retryCount-- > 0);}private void InitUnityWebRequest(UnityWebRequest webRequest, Request req){webRequest.timeout = req.Timeout;if (webRequest.uploadHandler != null && string.IsNullOrEmpty(req.ContentType) == false){webRequest.uploadHandler.contentType = req.ContentType;}var queryString = req.GetQueryString();if (string.IsNullOrEmpty(queryString) == false){if (webRequest.url.EndsWith('?')){webRequest.url += queryString;}else{webRequest.url += $"?{queryString}";}}var headers = req.GetHeaders();foreach (var header in headers){webRequest.SetRequestHeader(header.Key, header.Value);}}public static bool DebugMode = true;private static void LogInfo(string method, long code, bool success, string info){string str = success ? $"<color=green>{info}</color>" : $"<color=red>{info}</color>";Debug.Log($"[{method}] [{code}] => {str}");}}
}

Request.cs

using System;
using System.Linq;
using System.Text;
using System.Collections.Generic;namespace MYTOOL.RestClient
{public class Request{public const string APPLICATION_JSON = "application/json";/// <summary>/// 超时时间/// </summary>public int Timeout { get; private set; }/// <summary>/// 重试次数/// </summary>public ushort RetryCount { get; private set; }/// <summary>/// 重试间隔(秒)/// </summary>public float RetryInterval { get; private set; }/// <summary>/// 内容/// </summary>public string BodyData { get; private set; }/// <summary>/// 内容类型/// </summary>public string ContentType { get; private set; }/// <summary>/// 请求是否完成/// </summary>public bool IsDone { get; private set; }/// <summary>/// 请求开始前的回调/// </summary>public Action OnBegin;/// <summary>/// 请求完成后的回调/// </summary>private readonly Action<Response> OnComplete;private readonly Dictionary<string, string> Headers;private readonly Dictionary<string, List<string>> Query;public Request(Action<Response> onComplete, int timeout = 10){OnComplete = onComplete;Timeout = timeout;Headers = new Dictionary<string, string>();Query = new Dictionary<string, List<string>>();}public Request(Action<Response> onComplete, string bodyData, int timeout = 10) : this(onComplete, timeout){BodyData = bodyData;}public Request Reset(){IsDone = false;return this;}internal void Invoke(bool succeed, long statusCode, byte[] data, string error){IsDone = true;OnComplete?.Invoke(new Response(succeed, statusCode, data, error));}public Request AddQuery(string key, string value){if (Query.ContainsKey(key) == false){Query[key] = new List<string>();}Query[key].Add(value);return this;}public bool RemoveQuery(string key){return Query.Remove(key);}public Request SetRequestHeader(string key, string value){Headers[key] = value;return this;}public Dictionary<string, string> GetHeaders(){return new Dictionary<string, string>(Headers);}public string GetQueryString(){StringBuilder sb = new StringBuilder();foreach (var kv in Query){if (sb.Length > 0 && kv.Value.Count > 0) sb.Append('&');// 将每个键值对转换为字符串并连接起来var values = string.Join('&', kv.Value.Select(value => $"{kv.Key}={value}"));sb.Append(values);}return sb.ToString();}/// <summary>/// 设置超时时间/// </summary>/// <param name="timeout"></param>/// <returns></returns>public Request SetTimeout(int timeout){Timeout = timeout;return this;}/// <summary>/// 设置重试参数/// </summary>/// <param name="retryCount">重试次数</param>/// <param name="sec">重试间隔(秒)</param>/// <returns></returns>public Request SetRetryOption(ushort retryCount, float retryInterval){RetryCount = retryCount;RetryInterval = retryInterval;return this;}/// <summary>/// 设置Body内容/// </summary>/// <param name="bodyData"></param>/// <returns></returns>public Request SetBodyData(string bodyData){BodyData = bodyData;return this;}/// <summary>/// 设置Body内容,并指定内容类型/// </summary>/// <param name="bodyData"></param>/// <param name="contentType">如:application/json</param>/// <returns></returns>public Request SetBodyData(string bodyData, string contentType){BodyData = bodyData;ContentType = contentType;return this;}/// <summary>/// 设置内容类型/// </summary>/// <param name="contentType">如:application/json</param>/// <returns></returns>public Request SetContentType(string contentType){ContentType = contentType;return this;}}
}

Response.cs

using System.Text;namespace MYTOOL.RestClient
{public class Response{public bool Succeed { get; }public long StatusCode { get; }public byte[] Data { get; }public string Error { get; }public bool HasError => string.IsNullOrEmpty(Error) == false;public Response(bool succeed, long statusCode, byte[] data, string error){Succeed = succeed;StatusCode = statusCode;Data = data;Error = error;}public string GetResponseData(Encoding encoding = null){if (Data == null) return "";encoding ??= Encoding.UTF8;return encoding.GetString(Data);}}
}

使用例子

using MYTOOL.RestClient;
using UnityEngine;public class NewBehaviourScript : MonoBehaviour
{private RestWebClient client;private void Awake(){//初始化client = new RestWebClient(this);}private void Start(){//设置请求完成后回调 与 超时时间Request req = new Request(OnGetBaidu, 30);//设置重试次数 与 重试间隔req.SetRetryOption(3, 0.2f);client.Get("https://www.baidu.com/", req);}void OnGetBaidu(Response resp){if (resp.Succeed){if (resp.StatusCode == 200 || resp.StatusCode == 204){Debug.Log($"请求成功,{resp.GetResponseData()}");}}else{Debug.Log($"请求失败,{resp.Error}");}}
}

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java学习Day20:基础篇10
  • 二进制与进制转换与原码、反码、补码详解--内含许多超详细图片讲解!!!
  • React(四):DOCX文件在线预览
  • 2024杭电多校(5) 1008. 猫咪们狂欢【带权最大独立集】
  • 宅家也能高效办公?试试这四款款远程控制神器!
  • 【2024年华数杯全国大学生数学建模竞赛】C题:老外游中国 问题思路分析及Python代码实现
  • C语言初阶(12)
  • 周鸿祎回应将成三六零第一大股东:会和公司一起走下去
  • 学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)
  • mysql介绍
  • 1、.Net UI框架:WPF - .Net宣传系列文章
  • 反转链表(LeetCode)
  • 重燃代码之光:在PyCharm中恢复自动高亮的秘籍
  • Linux系统中的高级内核模块调试技术
  • override的作用和好处
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • angular组件开发
  • C++类中的特殊成员函数
  • CEF与代理
  • Codepen 每日精选(2018-3-25)
  • export和import的用法总结
  • Mocha测试初探
  • PAT A1017 优先队列
  • react-native 安卓真机环境搭建
  • Shell编程
  • Terraform入门 - 1. 安装Terraform
  • unity如何实现一个固定宽度的orthagraphic相机
  • ViewService——一种保证客户端与服务端同步的方法
  • vue2.0项目引入element-ui
  • VuePress 静态网站生成
  • 那些年我们用过的显示性能指标
  • 实现简单的正则表达式引擎
  • 事件委托的小应用
  • 项目管理碎碎念系列之一:干系人管理
  • 责任链模式的两种实现
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​数据结构之初始二叉树(3)
  • # 数仓建模:如何构建主题宽表模型?
  • $$$$GB2312-80区位编码表$$$$
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .Net 8.0 新的变化
  • .NET Core 项目指定SDK版本
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET Reactor简单使用教程
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net Web项目创建比较不错的参考文章
  • .net 连接达梦数据库开发环境部署
  • .Net 应用中使用dot trace进行性能诊断
  • .net下简单快捷的数值高低位切换