网络数据请求(unity)

算是老版本的常用方式了,现多用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访问的返回值不容易获取

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
UnityWebRequest 是 Unity 引擎提供的一种用于发送网络请求的类,它支持多种协议,包括 HTTP、HTTPS、FTP、File 等。下面是一个简单的例子,演示如何使用 UnityWebRequest 发送一个 GET 请求: ```csharp IEnumerator GetRequest(string url) { using (UnityWebRequest webRequest = UnityWebRequest.Get(url)) { yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError("Error: " + webRequest.error); } else { Debug.Log("Response: " + webRequest.downloadHandler.text); } } } ``` 这里使用了 IEnumerator 和 yield 关键字,因为 UnityWebRequest 是异步执行的,需要使用协程来处理。 使用 UnityWebRequest 发送 POST 请求也很简单,只需要将上面的 GetRequest 方法修改为: ```csharp IEnumerator PostRequest(string url, string data) { byte[] bodyRaw = Encoding.UTF8.GetBytes(data); using (UnityWebRequest webRequest = UnityWebRequest.Post(url, "POST")) { webRequest.uploadHandler = new UploadHandlerRaw(bodyRaw); webRequest.downloadHandler = new DownloadHandlerBuffer(); webRequest.SetRequestHeader("Content-Type", "application/json"); yield return webRequest.SendWebRequest(); if (webRequest.result == UnityWebRequest.Result.ConnectionError || webRequest.result == UnityWebRequest.Result.ProtocolError) { Debug.LogError("Error: " + webRequest.error); } else { Debug.Log("Response: " + webRequest.downloadHandler.text); } } } ``` 这里使用了 UploadHandlerRaw 将请求体转换为 byte 数组,并设置了 Content-Type 为 application/json。同时使用 DownloadHandlerBuffer 接收服务器响应的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值