发送Post表单
在unity中,www类虽然满足了很多需求但也失去了一部分自由,下面我们用C#实现发送post请求,传递表单,并获取或设置cookie,
private IEnumerator Login(string _url)
{
//设置链接
Uri url = new Uri(_url);
//设置http请求
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
//表单数据
byte[] _data = Encoding.UTF8.GetBytes("account=" + "CarefreeQ" + "&password=" + "CarefreeQ");
//内容类型
request.ContentType = "application/x-www-form-urlencoded";
//内容长度
request.ContentLength = _data.Length;
//设置cookie,如要获取则不能为空
request.CookieContainer = new CookieContainer();
//创建流
Stream stream = request.GetRequestStream();
//写入数据
stream.Write(_data, 0, _data.Length);
stream.Close();
//开始接收响应
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//获取cookie
string cookie = request.CookieContainer.GetCookieHeader(url);
//接收流
stream = response.GetResponseStream();
//内容长度
int max = (int)response.ContentLength;
int len = 0;
//数据长度
_data = new byte[max];
while (len < max)
{
//写入响应数据
int _len = stream.Read(_data, len, _data.Length);
len += _len;
yield return new WaitForEndOfFrame();
}
//读取数据
string text = Encoding.UTF8.GetString(_data);
}
下载文件到本地
在unity的开发中,我们经常会把资源保存到网上,比如一些网格,assetbundle,配置文件,贴图等等。我们希望在用户使用时下载到本地。
private IEnumerator Download(string _url)
{
//设置保存路径
string path = "自定义目录";
//这个方法可以新建一个线程运行,来提高效率和降低卡顿,这里就不写了
Uri url = new Uri(_url);
//创建接受
WebRequest request = WebRequest.Create(url);
//以下为接收响应的方法
WebResponse response = request.GetResponse();
//创建接收流
Stream stream = response.GetResponseStream();
//检查目录是否存在,不存在则创建
string dir = path.Substring(0, path.LastIndexOf("/"));
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
//文件写入路径
FileStream file = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
//返回内容总长度
int max = (int)response.ContentLength;
int len = 0;
while (len < max)
{
//byte容器
byte[] data = new byte[10240000];
//循环读取
int _len = stream.Read(data, 0, data.Length);
//写入文件
file.Write(data, 0, _len);
len += _len;
//如果需要传递进度,可以这样算
//float progress = len / (float)max;
yield return new WaitForEndOfFrame();
}
//写入完后关闭文件流和接收流
file.Close();
stream.Close();
}
结束语
这是一些功能,在实际使用中,需要封装成异步加入回调完整实现方法来方便大家使用以及扩展。效率方面文件的写入,需要新建线程来存储,在主线程中会引起卡顿,因为帧等待了。