Unity3D網絡通訊(三)-- HttpRestful請求的簡單封裝

2021-02-16 微卡智享

實現Http請求的封裝,我們主要考慮的就是兩個問題:

所有的網絡通訊都寫在一個類裡,外部調用只考慮傳入參數即可,做到解耦效果

Unity的通訊是用協程方式實現網絡通訊,怎麼處理通訊返回的值後續的操作

第一個問題正常的封裝都會考慮到這個,這裡就不在說了,主要我們考慮的是第二個問題,因為是通過協程的方式處理網絡通訊,沒法實現我們正常封裝只方法給出返回值的方式實現,所以這裡應該用的就是傳入回調函數的方式處理。所以這篇我們就用Action的方式解決這個問題。
我們在Scripts下建了一個Model的文件夾(存放對象類)和一個Utils的文件夾(存放工具類),然後把WeatherForecase類移動到Model下,在Utils文件夾下再創建一個Network的文件夾,用於處理網絡通訊,然後在這文件夾下創建一個HttpRestful的C#腳本。

寫Get的協程方法調用,其中最後一個參數就是Action<bool, string>的方法,其中Action的第一個參數bool,用於返回通訊的成功或失敗,第二個參數string是返回的通訊信息。

外部調用的Get方法傳入的參數一樣,內部是直接開戶協程操作,下面的Post的實現也是按這個思路來寫,只不過傳入的參數裡要加入一個我們傳入的數據即可。
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<HttpRestful>(); } return _instance; } }
#region Get請求 public void Get(string url, Action<bool, string> actionResult = null) { StartCoroutine(_Get(url, actionResult)); }
private IEnumerator _Get(string url, Action<bool, string> 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<bool, string> actionResult = null) { StartCoroutine(_Post(url, data, actionResult)); }
private IEnumerator _Post(string url, string data, Action<bool, string> 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}

我們重新複製了一個UIScripts,然後其中一個名字後面加上了Old,這樣就是不用再重新設置了,我們直接在UIScripts腳本中改造即可。

首先定義一個Action<bool, string>,其中參數和HttpRestful裡傳入的Action方法是一樣的。

然後增加一個InitAction的方法,裡面對定義的actionRes寫其的實現方法。方法中就是判斷通訊如果失敗直接顯示文本,成功後進行處理,再顯示處理後的數據,因為Get和Post調用後返回的數據類型是一樣的,這樣我們這裡寫了一個Action都可以調用這個方法進行後面的數據處理。

然後我們在Start裡面首先把初始化Action進行調用,然後使用
HttpRestful.Instance.Get(url, actionRes);HttpRestful.Instance.Post(url, json, actionRes);

就可以直接進行數據處理了,剩下的我們昨天調用的方法就可以都刪除了。
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;
private Action<bool, string> actionRes; void Start() { InitAction();
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); }); }
private void InitAction() { actionRes = new Action<bool, string>((bl, str) => { if (bl) { txtshow.text = str; } else { string resjson = "{\"array\":" + str + "}"; txtshow.text = resjson; WeatherData lists = JsonUtility.FromJson<WeatherData>(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<WeatherForecast>(json); string showtext = "Summary:" + newitem.Summary + " Date:" + newitem.Date + " C:" + newitem.TemperatureC + " F:" + newitem.TemperatureF; txtshow.text = showtext; }}


上圖就是封裝後調用WebApi的實現效果,後面我又在Android平臺下進行了編譯,調用也完全沒有問題,這種方式可以跨平臺使用的。





相關焦點

  • 網絡請求利器OkHttp的使用以及簡單封裝
    Android開發中網絡編程是必不可少的,不接入網際網路的APP就沒有盈利可言。廢話不多說了,下面請先看Android中網絡請求的進化圖:        HttpURLConnection,Apache HTTP Client,Volley到現在的OKHttp,可謂天外有天,人外有人。為什麼OKHttp會這麼火呢,相信下面的介紹會告訴你答案。
  • Unity3D網絡通訊(六)-- UnityWebRequest實現WebService通訊
    前面幾篇文章把主要的網絡通訊方式都已經講完了,今天是這個系列的最後一講,關於WebService的通訊,主要是現在這個也不是主流,但是像如果對數據交互的老系統中用過
  • Android 開源項目推薦之「網絡請求哪家強」
    App 開發都會遇到的,這也難怪之前很多人留言讓我寫寫網絡請求到底該怎麼選擇,今天就來說說網絡請求到底哪家強!    Volley、OkHttp、Retrofit 三個,android-async-http 的作者已經不維護,所以這裡就不多說了,下面我們分別來說說這三個庫的區別。
  • java簡單的封裝翻譯框架
    1,準備工作:註冊一個百度帳號,在http://api.fanyi.baidu.com/api/trans/product/apidoc個網址裡面拿到appid和key值2,直接開始擼代碼:java簡單的封裝翻譯框架
  • Python接口自動化之requests請求封裝
    以下主要介紹如何封裝請求。接下來將請求類型都封裝起來,自動化用例都可以用這個封裝的請求類進行請求,我們將常用的get、post請求封裝起來。以上代碼痛點如下:代碼量大:只是封裝了get、post請求,加上其他請求類型,代碼量較大;缺少會話管理:請求之間如何保持會話狀態。
  • unity3d遊戲引擎開發的遊戲都有哪些?
    Unity3d是目前主流的遊戲開發引擎,它提供了一個整合的編輯器、跨平臺發布、地形編輯、著色器,腳本,網絡,物理,版本控制等特性。Unity3d可以開發桌面版、web版、手機版的遊戲,是一個非常理想的三維遊戲開發平臺。
  • vue中簡單的axios二次封裝
    cookie 的,需要設置 fetch(url, {credentials: 'include'})2)伺服器返回 400,500 錯誤碼時並不會 reject,只有網絡錯誤這些導致請求不能完成時,fetch 才會被 reject。
  • 在雲開發中進行http網絡請求教程
    在雲開發中進行http網絡請求教程今天簡單給大家寫一個在雲開發中進行http網絡請求的教程,至於用法大家應該也應該明白,這樣可以解決很多問題,比如說小程序是不支持未配置ssl的域名請求的,但是在雲開發的雲函數中可以,這樣就不用但是
  • Unity3d遊戲程序開發培訓靠譜嗎?好就業嗎?
    學習unity3d遊戲程序開發好就業嗎?其實大家心裡也清楚,我們參加unity3d遊戲程序開發培訓的目的是為了提高自己麼,而更多的是為了找一份高薪高待遇的工作,為了自己未來能有一個好的發展。那麼學習unity3d遊戲程序開發好就業嗎,老師告訴你,真的很容易就業!為什麼?
  • 即時通訊框架SocketIO的入門學習
    網絡七層:應用層表示層會話層傳輸層網絡層數據鏈路層物理層而socket位於應用層與傳輸層之間,簡寫SSL(Secure Sockets Layer 安全套接層),而其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
  • Android網絡優化攻略,簡單了解一下?
    如果你的網絡層用的是OkHttp的話,Okhttp在封裝的時候就已經考慮到這個部分了,其內部提供了Dns的接口,可以讓外部在構造Client的時候傳入。https://blog.csdn.net/firefile/article/details/80532161CacheControlHttp請求在1.1階段就引入了CacheControl了,通過CacheControl可以讓後端直接控制請求內容的緩存策略。所以還有比緩存更簡單粗暴的網絡優化方式嗎?
  • spring cloud中RestTemplate網絡請求框架和Ribbon負載均衡器
    本片主要是介紹spring cloud構建微服務系統的RIbbon負載均衡器和網絡請求框架RestTemplate的介紹。下一篇文章將會通過實例帶領大家如何通過Ribbon和RestTemplate相結合實現負載均衡。
  • winform項目——仿QQ即時通訊程序09:socket通信示例程序
    本篇文章將對程序通訊的原理進行分析,用具體的例子演示通訊過程。CIM項目的核心就是基於這種通訊。學習過網絡的同學應該知道,兩臺設備之間進行信息的傳遞需要經過複雜的信息處理過程,不管是OSI模型還是TCP/IP模型都需要經過很多複雜的步驟才能進行通訊,其實這種抽象出來的通訊模型已經足夠簡單了,但是裡面的具體實現是特別複雜的。
  • 工業網絡通訊實訓系統
    《中國製造2025》計劃中指出力爭通過三個十年的努力,到新中國成立一百年時,把我國建設成為引領世界製造業發展的製造強國,而《中國製造2025》是我國實施製造強國戰略第一個十年的行動綱領。
  • Java網絡編程——發送HTTP請求到伺服器
    當Java程序需要向伺服器發送請求或讀取伺服器數據時,使用URLConnection類是比較好的選擇。URLConnection類封裝了與伺服器互動操作的方法,通過它可以建立與伺服器的遠程連接,檢查伺服器資源的屬性,向伺服器發送請求並接收伺服器返回的數據。
  • GPON與EPON光通信組件訂單升溫 ToCAN封裝產能吃緊
    在去年底光纖通訊需求表現逐漸回穩下,今年第一季大陸GPON與EPON組件訂單已正式升溫。今年2月份大陸系統商客戶對於EPON光通訊組件已不再要求砍價,算是釋出正面的訊息。而最火熱的則是GPON的需求,近日臺灣光通訊市場已傳出GPON ToCAN次模塊已經缺貨,客戶訂單量遠大於供給量,預計訂單已排到今年的6月份。  目前國內供應GPON ToCAN封裝次模塊的公司,一家在新北市,一家則在新竹工業園區,目前已被客戶要求加緊生產。惟近1個多月來下遊的系統商需求激增,廠商直言,3~4月份難以應付客戶訂單要求。
  • 程式設計師的術與道:術——編程基本功之網絡編程
    ,包括ethereal/tcpdumphpingnmapnetstatnetpipenetperfvnstatntop三、網絡開發功能工具客戶端/伺服器架構socket 編程數據包抓獲和協議分析libpap 等函數庫實現某個協議參考相關的 RFC 文檔,並通過 socket 編程來實現3.1 linux網絡編程步驟3.1.1 創建套接字
  • 第85p,簡單講講網絡編程OSI七層協議
    大家好,我是楊數Tos,這是《從零基礎到大神》系列課程的第85篇文章,第三階段的課程:Python進階知識:網絡編程之OSI七層協議(一)。我們打開一個網頁(或者是APP),可以看到相應的頁面內容;打開頁面的這個過程中,我們的瀏覽器(或者是APP)會向指定的伺服器中發送請求,伺服器根據請求內容返回相應的頁面。而所有的APP(網站)都是基於CS(或是BS)架構,所有的網絡請求都離不開「網際網路通信協議,即:OSI七層協議。
  • 網絡編程基礎學習筆記2:socket接口及網絡編程三要素
    各接口功能如下圖所示:網絡編程的三要素(IP位址、埠以及通信協議):其中,IP位址是每個設備在網絡中的唯一標誌,相當於我們的身份證一樣,每臺網絡中斷在網絡中都是獨立存在的個體,一般都可以通過IPconfig來查看自身的IP位址,當然,由於我們現在的電腦大多數都不只是一個網卡,所以在多個網卡都連接上路由器並且都激活的情況下
  • 通訊系統工程師學習筆記(10)|生動詳解OSI七層、網絡五層、TCP/IP四層、TCP/UDP/Http/Socket的關係
    基於TBOX的產品功能特徵,產品工程師除了要了解傳統車端ECU的通用知識,還需要擴充通信網絡信息安全等背景知識。只有實現了跨汽車電子、通信、計算機網絡等專業的知識融合,才可配得上通訊系統工程師的稱呼。作為一隻求知路上不斷掙扎的選手,對一些崗位必備的知識梳理成筆記,供自己實時重溫。