Unity 如何实现异步UnityWebRequest请求

前言

Unity官方从2018开始,已经不推荐使用WWW了,更推荐使用UnityWebRequest,UnityWebRequest的使用方法和WWW类似,都是使用协程的方式来等待网络回复,但是存在几个问题:

1.协程只能在Unity运行时使用。所以编辑器工具如果要做网络请求,就没法用协程了。
2.协程是同步阻塞的方式,无法做大量数据的异步请求。
3.协程不太容易做请求数据的返回。

出于对以上问题的考虑,而我的需求又是需要做批量的http请求,所以不得不使用异步的方式来实现。
故有了今天的解决方案,遂记录下来,供大家参考。

Get请求

Get请求是最简单的,参数都在URL的?后面,所以也没有什么特殊注意事项,使用异步async-await方式请求即可,代码如下:

    /// /// Post请求json数据/// /// static async Task<string> RequestGet(string url){// 创建UnityWebRequest对象UnityWebRequest www = UnityWebRequest.Get(url);www.downloadHandler = new DownloadHandlerBuffer();// 发送请求并等待响应await www.SendWebRequest();// 处理响应if (www.result != UnityWebRequest.Result.Success){Debug.Log(www.error);return null;}else{Debug.Log("Form upload complete!");return www.downloadHandler.text;}}

Post请求

Post请求稍微麻烦一些,因为我们要带上表头数据,比如Json格式的表头数据,使用async-await方式请求,代码如下:

    /// /// Post请求json数据/// /// URL/// 请求json数据/// /// Post请求json数据/// /// URL/// 请求json数据static async Task<string> RequestPost(string url, string jsonArgs){// 创建UnityWebRequest对象UnityWebRequest www = UnityWebRequest.Post(url, "");byte[] postBytes = Encoding.UTF8.GetBytes(jsonArgs);www.uploadHandler = new UploadHandlerRaw(postBytes);www.downloadHandler = new DownloadHandlerBuffer();www.SetRequestHeader("Content-Type", "application/json");// 发送请求并等待响应await www.SendWebRequest();// 处理响应if (www.result != UnityWebRequest.Result.Success){Debug.Log(www.error);return null;}else{Debug.Log("Form upload complete!");return (www.downloadHandler.text);}}

文件下载

以前做文件下载,可能会使用HttpWebRequest,然后对返回的数据流进行读取,等待流读取完毕,再写入到本地,代码会相对复杂一些。现在UnityWebRequest对文件的下载支持相对比较好了,我们不需要在使用原生的HttpWebRequest了,下面来看下如何使用异步方式async-await来实现大文件下载,代码如下:

    /// /// 下载文件/// /// 下载地址/// 文件保存地址static async Task<bool> DownloadFile(string url, string filePath){UnityWebRequest www = UnityWebRequest.Get(url);// 发送请求并等待响应await www.SendWebRequest();// 处理响应if (www.result != UnityWebRequest.Result.Success){Debug.Log(www.error);return false;}else{// 将响应数据写入本地文件Debug.Log("File download complete!");File.WriteAllBytes(filePath, www.downloadHandler.data);return true;}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部