最近需要做網(wǎng)絡(luò)模塊相關(guān),主要是與后臺(tái)的數(shù)據(jù)交互驗(yàn)證貌矿,那么就需要找到unity網(wǎng)絡(luò)相關(guān)的api,通過查閱unity文檔發(fā)現(xiàn)主要通過UnityWebRequest與后臺(tái)交互
在android開發(fā)中請(qǐng)求方式使用的是POST/GET請(qǐng)求方式滔岳,在unity中也是一樣的:
- GET方式
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class MyBehaviour : MonoBehaviour {
void Start() {
StartCoroutine(GetText());
}
IEnumerator GetText() {
UnityWebRequest www = UnityWebRequest.Get("http://www.my-server.com");
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError) {
Debug.Log(www.error);
}
else {
// Show results as text
Debug.Log(www.downloadHandler.text);
// Or retrieve results as binary data
byte[] results = www.downloadHandler.data;
}
}
}
- POST方式
List<IMultipartFormSection> iparams = new List<IMultipartFormSection> ();
iparams.Add (new MultipartFormDataSection("account", userTxt.text));
iparams.Add (new MultipartFormDataSection("password", psdTxt.text));
iparams.Add (new MultipartFormDataSection("yzmcode", yzmTxt.text));
Debug.Log ("account:" + userTxt.text + " password:" + psdTxt.text + " yzmcode:" + yzmTxt.text);
iparams.Add (new MultipartFormDataSection("platform", "android"));
UnityWebRequest loginRequest = UnityWebRequest.Post (UrlUtils.baseUrl + UrlUtils.loginUrl, iparams);
yield return loginRequest.SendWebRequest ();
if (loginRequest.isHttpError || loginRequest.isNetworkError) {
} else {
string loginResult = loginRequest.downloadHandler.text;
result.text = loginResult;
yield return new WaitForSeconds(2f);
result.text = "";
}
列表的IMultipartFormSection用來提交表單數(shù)據(jù)声邦,注意區(qū)分IMultipartFormSection和MultipartFormDataSection
- 請(qǐng)求的url是圖片的情況,請(qǐng)求的地址類似于http://test.xxxx.com/zh/upload/mobyzm/20180305/0.9308257626405821.JPEG時(shí)使用
UnityWebRequest wr = new UnityWebRequest(detail.yzmPath);
DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
wr.downloadHandler = texDl;
yield return wr.SendWebRequest ();
if (wr.isNetworkError || wr.isHttpError) {
} else {
Texture2D t = texDl.texture;
Sprite s = Sprite.Create(t, new Rect(0, 0, t.width, t.height),
Vector2.zero, 1f);
yzmImage.sprite = s;
}
- unity中的json解析
- 通過使用,官方的JsonUtility.FromJson<數(shù)據(jù)結(jié)構(gòu)>() 方法用于解析簡(jiǎn)單結(jié)構(gòu)的jsonString無錯(cuò)誤谅畅,對(duì)于json中嵌套對(duì)象的解析會(huì)出錯(cuò)登渣,不知道是不是我數(shù)據(jù)結(jié)構(gòu)定義的問題...(相同的結(jié)構(gòu)使用插件LitJson解析結(jié)果正常),所以就放棄使用JsonUtility了
-
LitJson比較好用,插件下載后放入asset中毡泻,在使用的腳本中聲明
using LitJson;
后用dataModel model = JsonMapper.ToObject<dataModel> (jsonString);
解析json胜茧,數(shù)據(jù)結(jié)構(gòu)的定義需要根據(jù)json結(jié)果中的鍵值對(duì)命名
- 自己做的demo工程,實(shí)現(xiàn)了簡(jiǎn)單的登錄與驗(yàn)證碼圖片的請(qǐng)求
帶有cookie管理的HttpRequest請(qǐng)求
在一些后臺(tái)需要驗(yàn)證session信息的情況下(例如在登陸時(shí)候需要check驗(yàn)證碼操作仇味,所以正常流程是在登陸之前請(qǐng)求一次驗(yàn)證碼呻顽,同時(shí)后臺(tái)將寫有驗(yàn)證碼的相關(guān)session信息在response中返回,之后登錄請(qǐng)求中如果沒有攜帶session信息后臺(tái)無法驗(yàn)證驗(yàn)證碼)丹墨,使用UnityWebRequest請(qǐng)求沒有設(shè)置session后臺(tái)獲取不到這些信息芬位,并且也沒有找到資料參考怎么設(shè)置,(一個(gè)遇到相同問題的網(wǎng)友提問)
之后經(jīng)過查找带到,發(fā)現(xiàn)了BestHttp插件昧碉,(能取這個(gè)名字想來開發(fā)者挺自信的)英染,集成驗(yàn)證后發(fā)現(xiàn)已經(jīng)實(shí)現(xiàn)了對(duì)Cookie的本地緩存管理
簡(jiǎn)單&&常用用法:
第一步導(dǎo)入插件,在使用的腳本中加入 using BestHTTP;
第二步請(qǐng)求:
????1. get請(qǐng)求:
// onRequestFinished是回調(diào)方法
HTTPRequest www = new HTTPRequest(new System.Uri(UrlUtils.baseUrl + UrlUtils.getYzmPic), onRequestFinished);
www.Send ();
void onRequestFinished(HTTPRequest request, HTTPResponse response) {
// 處理回調(diào)
if (response != null && response.IsSuccess) {
Debug.Log(response.DataAsText + response.Message);
}
else{
}
}
????2. Post請(qǐng)求
HTTPRequest www = new HTTPRequest (new System.Uri(uri), HTTPMethods.Post, listenerMothed);
www.AddField ("key1", value1);
www.AddField ("key2", value2);
... ...
www.Send ();
????鏈?zhǔn)綄懛ǎ?/p>
HTTPRequest www = new HTTPRequest (new System.Uri (uri), HTTPMethods.Post, (request, response) => {
});
www.Send ();
設(shè)置超時(shí)(發(fā)送請(qǐng)求到接受應(yīng)答的過程)時(shí)間被饿,(默認(rèn)60s):
www.Timeout = System.TimeSpan.FromSeconds(3f);
第三步 處理請(qǐng)求結(jié)果
NOTICE:在網(wǎng)絡(luò)連接不可用時(shí)四康,回調(diào)中的response == null,在請(qǐng)求時(shí)判斷當(dāng)前網(wǎng)絡(luò)是否可用 或者判斷reponse是否為空
if (Application.internetReachability != NetworkReachability.NotReachable) {
httpRequest ww = new ...
}
// 或者
onResponse(HTTPRequest request, HTTPResponse response) {
// 判斷response == null 的情況
if (response != null && response.IsSuccess)
}