1. 程式人生 > 程式設計 >UnityWebRequest前後端互動實現過程解析

UnityWebRequest前後端互動實現過程解析

一、技術概述

1、描述這個技術是做什麼?

是Unity一套網路工具庫,用於進行Http請求

2、學習該技術的原因?

專案需要,防止使用C#原生的網路庫,加快開發速度

3、技術的難點在哪裡

Unity僅提供了基礎的功能,如何把這些功能構造成一個能夠穩定業務開發的流程是一個比較難處理的問題

二、技術詳情

描述你是如何實現和使用該技術的,要求配合程式碼和流程圖詳細描述。

HttpCenter類:封裝Get、Post、Put、Delete,維護一個請求佇列

///Get方法例舉
private IEnumerator StartGet(HttpRequest request)
    {
      var url = request.Url + "?";
      //反射用來填充Url
      Type type = Type.GetType(request.MsgName);
      var Msg = Convert.ChangeType(request.Msg,type);
      PropertyInfo[] properties = Msg.GetType().GetProperties();
      for (int i = 0; i < properties.Length; i++)
      {
        url += $"{properties[i].Name}={properties[i].GetValue(Msg)}";
        if (i != properties.Length - 1)
          url += "&";
      }
      request.Url = url;
      using (UnityWebRequest www = UnityWebRequest.Get(request.Url))
      {
        www.certificateHandler = new AcceptAllCertificatesSignedWithASpecificKeyPublicKey();
        www.downloadHandler = new DownloadHandlerBuffer();
        www.SetRequestHeader("Content-Type","application/json");
        www.SetRequestHeader("token",token);
        yield return www.SendWebRequest();
        DealResult(www,request);
      }

工程中如何使用:封裝請求、資料,註冊委託,呼叫委託並添加回調

  //部分封裝
  public Action<LoginMsg,Action<HttpResponds>> NetLogin;
  public class LoginMsg : BaseMsg
  {
  public LoginMsg(string username,string password)
  {
    this.username = username;
    this.password = password;
  }
  public string username { get; set; }
  public string password { get; set; }
  }
  public class HttpResponds
  {
    public string data;
    public RespondsResult Result;
    public string token;
  }
  //註冊委託
  AddListener(ref MsgManager.Instance.NetMsgCenter.NetLogin,Method.Post,"User/login");
  private void AddListener<T>(ref Action<T,Action<HttpResponds>> registerEvent,Method methodType,string url) where T:BaseMsg
  {
    registerEvent += (request,callback) =>
    {
      HttpRequest httpRequest = new HttpRequest()
      {
        Msg = request,HttpMethod = Method.Post,Url = HttpCenter.path + url,Handler = (responds) =>
        {
          if (responds.Result == RespondsResult.Succ)
          {
            try
            {
              callback(responds);
            }
            catch(Exception ex)
            {
              
              Debug.Log("視窗已銷燬");
              if(nowScene == 0)
              {
                SceneManager.LoadScene(1);
              }
              else
              {
                SceneManager.LoadScene(0);
              }
            }
          }
        }
      };
      HttpCenter.Instance.Send(httpRequest);
    };
  }
  ///呼叫,添加回調
  MsgManager.Instance.NetMsgCenter.NetLogin(msg,(responds) =>
       {
         HttpCenter.Instance.token = responds.token;
         GetUserMsg userMsg = new GetUserMsg(accountField.text);
         MsgManager.Instance.NetMsgCenter.NetGetUser(userMsg,(getUserResponds) =>
         {
           NetDataManager.Instance.user = JsonHelper.DeserializeObject<User>(getUserResponds.data);
           UIMgr.Instance.CreateFrame("PersonalFrame");
         });
       });

三、技術使用中遇到的問題和解決過程

關於WebRequest中有個奇怪的問題,至今未搞懂,但是有暫時的解決方法。問題是Post方法直接設定失效,需要先宣告為Put,之後再www.method = UnityWebRequest.kHttpVerbPOST;

四、總結

主要是基於UnityWebRequest做了一些封裝、利用反射、委託等特性來實現一些基本的功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。