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

Unity中Http框架

Unity中Http框架

  • 介绍
  • 框架代码
  • 使用方法
  • 总结

介绍

最近做了ASP.NET Web应用程序(.Net Framework)的Http服务,所以想也把之前我的Http框架也整理一下发布出来供大家参考。

框架代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class NetWorkHttpManager : MonoBehaviour
{
    #region 属性

    /// <summary>
    /// Web请求回调
    /// </summary>
    private Action<CallBackArgs> m_CallBack;

    /// <summary>
    /// Web请求回调数据
    /// </summary>
    private CallBackArgs m_CallBackArgs;

    /// <summary>
    /// 是否繁忙
    /// </summary>
    private bool m_IsBusy = false;

    /// <summary>
    /// 供外部访问是否繁忙
    /// </summary>
    public bool IsBusy
    {
        get
        {
            return m_IsBusy;
        }
    }

    /// <summary>
    /// 网络字典
    /// </summary>
    private Dictionary<string, string> m_httpDic = new Dictionary<string, string>();

    #endregion

    public static NetWorkHttpManager Instance;

    private void Awake()
    {
        Instance = this;
        m_CallBackArgs = new CallBackArgs();
    }


    #region 键值对

    /// <summary>
    /// 添加键值对
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    public void AddValueToDic(string key, string value)
    {
        m_httpDic.Add(key,value);
    }

    /// <summary>
    /// 移除字典
    /// </summary>
    /// <param name="key"></param>
    public void RemoveValueToDic(string key)
    {
        if (m_httpDic.ContainsKey(key))
        {
            m_httpDic.Remove(key);
        }
    }

    /// <summary>
    /// 获取字典
    /// </summary>
    public Dictionary<string,string> GetDic()
    {
        return m_httpDic;
    }

    /// <summary>
    /// 清楚字典
    /// </summary>
    public void ClearDic()
    {
        m_httpDic.Clear();
    }

    #endregion

    #region SendData 发送Web数据

    public void SendData(string url, Action<CallBackArgs> callBack, bool IsPost = false, Dictionary<string, string> dic = null)
    {
        if (m_IsBusy) return;
        m_IsBusy = true;
        m_CallBack = callBack;
        if (!IsPost) GetUrl(url);
        else
        {
            PostUrl(url,dic);
        }
    }

    #endregion

    #region GetUrl Get请求

    /// <summary>
    /// Get请求
    /// </summary>
    /// <param name="url"></param>
    private void GetUrl(string url)
    {
        UnityWebRequest req = UnityWebRequest.Get(url);
        StartCoroutine(Request(req));
    }

    #endregion

    #region PostUrl Post请求

    /// <summary>
    /// Post请求
    /// </summary>
    /// <param name="url"></param>
    /// <param name="json"></param>
    private void PostUrl(string url, Dictionary<string, string> dic)
    {
        UnityWebRequest req = UnityWebRequest.Post(url, dic);

        StartCoroutine(Request(req));
    }

    #endregion

    #region Request 请求服务器

    /// <summary>
    /// 请求服务器
    /// </summary>
    /// <param name="req"></param>
    /// <returns></returns>
    private IEnumerator Request(UnityWebRequest req)
    {
        yield return req.SendWebRequest();
        m_IsBusy = false;

        //没有错误
        if (string.IsNullOrEmpty(req.error))
        {
            if (req.downloadHandler.text == "null")
            {
                if (m_CallBack != null)
                {
                    m_CallBackArgs.HasError = true;
                    m_CallBackArgs.ErrorMsg = "未请求到用户";
                    m_CallBack(m_CallBackArgs);
                }
            }
            else
            {
                if (m_CallBack != null)
                {
                    m_CallBackArgs.HasError = false;
                    m_CallBackArgs.ErrorMsg = "";
                    m_CallBackArgs.Value = req.downloadHandler.text;
                    m_CallBack(m_CallBackArgs);
                }
            }
        }
        //有错误
        else
        {
            if (m_CallBack != null)
            {
                m_CallBackArgs.HasError = true;
                m_CallBackArgs.ErrorMsg = req.error;
                m_CallBack(m_CallBackArgs);
            }
        }
    }

    #endregion

}

#region 回调类

/// <summary>
/// Web请求回调数据
/// </summary>
public class CallBackArgs : EventArgs
{
    /// <summary>
    /// 是否有错误
    /// </summary>
    public bool HasError;

    /// <summary>
    /// 错误原因
    /// </summary>
    public string ErrorMsg;

    /// <summary>
    /// 返回值
    /// </summary>
    public string Value;
}

#endregion

使用方法

		//Get请求
        if (!NetWorkHttpManager.Instance.IsBusy) 
        {
            NetWorkHttpManager.Instance.SendData("urlxxxxxxxxxxxxx", (cb) => 
            {
                if (cb.HasError) 
                {
                    Debug.LogError(cb.ErrorMsg);
                }
                else 
                {
                    Debug.LogError(cb.Value);
                }
            });
        }
		
		//Post请求
		if (!NetWorkHttpManager.Instance.IsBusy) 
        {
            JsonData jsonData = new JsonData();
            jsonData["UserName"] = "ck";
            jsonData["Pwd"] = "ck123";

            NetWorkHttpManager.Instance.ClearDic();
            NetWorkHttpManager.Instance.AddValueToDic("", jsonData.ToJson());

            NetWorkHttpManager.Instance.SendData("http://192.168.1.120:8023/api/TestWeb", (cb) =>
            {
                if (cb.HasError)
                {
                    Debug.LogError(cb.ErrorMsg);
                }
                else
                {
                    Debug.LogError(cb.Value);
                }
            }, true, NetWorkHttpManager.Instance.GetDic());

        }

总结

感谢大家的支持!


http://www.kler.cn/a/414250.html

相关文章:

  • Vue+Elementui el-tree树只能选择子节点并且支持检索
  • Java中使用FFmpeg拉取RTSP流
  • open-instruct框架使用记录:只使用huggingface数据集的小部分进行训练,如何修改dataset_info.json文件
  • ViSTa:一个包含4000多个视频和逐步描述的层次化数据集,用于评估VLMs在不同复杂性任务中的表现。
  • Ettercap工具使用说明
  • shell完结
  • 微知-arp如何删除所有表项?(arp -d; ip neighbor delete 192.168.0.100)
  • 力扣—912. 排序数组
  • queue 和 Stack
  • Unity shaderlab 实现LineSDF
  • 根据中缀二叉树构建中缀表达式
  • 「Mac畅玩鸿蒙与硬件35」UI互动应用篇12 - 简易日历
  • Unity中的数学应用 之 插值函数处理角色朝向 (初中难度 +Matlab)
  • 【计算机网络】—— 物理层
  • IPguard与Ping32对比评测:数据安全保护谁更强?
  • 【热门主题】000067 React前端框架:探索高效Web开发之路
  • 在C#中使用OpenCV的.net包装器EmguCV
  • 11.25Scala
  • Maven 依赖项配置
  • 初级数据结构——二叉搜索树题库(c++)
  • RHCE——selinux和防火墙
  • 最新特性MCP协议客户端复现
  • 【R安装】VSCODE安装及R语言环境配置
  • 已解决WordPress图片无法显示,免插件实现WordPress上传图片时自动重命名
  • MySQL执行计划explain
  • vmware Ubuntu2004运行STAR-Searcher