[网络]Unity中Http访问和下载

发送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();
            }

结束语

这是一些功能,在实际使用中,需要封装成异步加入回调完整实现方法来方便大家使用以及扩展。效率方面文件的写入,需要新建线程来存储,在主线程中会引起卡顿,因为帧等待了。

你可能感兴趣的:(C#,Unity3D)