一、技術概述
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做了一些封裝、利用反射、委托等特性來實現一些基本的功能