算是老版本的常用方式了,现多用webrequest进行网络请求。本人新手自己的笔记手册,有错请指教
www网络数据请求
www get请求,直接开启www网络协程,参数拼接在url里,保密性不强,字段长度有限制,有的后台会进行get拦截。
最简单的网络请求(get)
IEnumerator getTest(string url)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && www.error == null)
{
Texture te = www.texture;//获取连接对应点图片
string name = www.text;//获取连接返回的文本信息
byte[] bt = www.bytes;//获取连接返回的字节数组
}
else
{
Debug.Log(www.error);
}
www.Dispose();
}
网络请求的各种参数自己看api吧,我就不写了
带有参数的get请求直接用连接符把参数拼接到url里进行访问,
www的post访问:
还没看post 的具体传输原理,数据传输携带的数据都是以字节数组进行传输的,跟不同语言进行交互,略坑,但是坑还是自己的锅,啥都別怨,自己慢慢找下原因和解决方法吧。
IEnumerator getTest(string url)
{
WWWForm form = new WWWForm();
form.AddField("user", "的点点滴滴");
WWW www = new WWW(url,form);
yield return www;
if (www.isDone && www.error == null)
{
Texture te = www.texture;
string name = www.text;
byte[] bt = www.bytes;
}
else
{
Debug.Log(www.error);
}
www.Dispose();
}
直接这样的写法没问题,对于java后台挺方便的,但是经常出现中文乱码,是form的默认编码格式的问题。
第二种post传输,直接携带header进行文件传输,一般不会出现编码问题。传输的文件是字节数组。
webReqest
本人和后端有交流障碍,交流感觉就是语言不通,先上代码吧
private static void test2(string userName)
{
string path = address + "";
try
{
System.GC.Collect();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
Dictionary<string, string> form = new Dictionary<string, string>();
form.Add("username", userName);
userName = JsonConvert.SerializeObject(form);
Debug.Log(userName+"username");
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
request.ContentLength = userName.Length;
request.KeepAlive = false;
request.Timeout = 6000000;
byte[] payload;
payload = System.Text.Encoding.UTF8.GetBytes(userName);
request.ContentLength = payload.Length;
Stream writer = request.GetRequestStream();
writer.Write(payload, 0, payload.Length);
writer.Close();
HttpWebResponse res;
try
{
System.Net.ServicePointManager.DefaultConnectionLimit = 200;
res = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
res = (HttpWebResponse)ex.Response;
}
StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.UTF8);
string retString = reader.ReadToEnd();
Debug.Log(retString);
if (request != null)
{
request.Abort();
}
if (res != null)
{
res.Close();
}
}
catch
{
}
}
这种方法的传输是unity5.2后支持的功能,但是感觉用的真心不顺手,大概是我不会偷懒和学习吧,下面说下我遇到的坑和敢接纠结的地方。
1.传输效率太慢,有时会出现超时连接,或者取消连接,看的一脸懵逼
2.遇到过文件流卡死,忘记怎么复现的了,也可进行异步执行
3.有时会遇到非常卡的情况,可能需要开线程或者协程
4.文件流的参数传输过去后是字符串形式,后来的www的文件流列表解决了,但是这个方式的没进行测试。
现在先写这几个,想起来再写
4.18添加,HttpWebRequest 可以脱离unity的mono进行运行,可以获取指定返回值,www访问的返回值不容易获取