Unity 如何实现异步UnityWebRequest请求

前言

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

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

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

Get请求

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

    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url"></param>
    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方式请求,代码如下:

    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url">URL</param>
    /// <param name="jsonArgs">请求json数据</param>
    /// <summary>
    /// Post请求json数据
    /// </summary>
    /// <param name="url">URL</param>
    /// <param name="jsonArgs">请求json数据</param>
    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来实现大文件下载,代码如下:

    /// <summary>
    /// 下载文件
    /// </summary>
    /// <param name="url">下载地址</param>
    /// <param name="filePath">文件保存地址</param>
    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;
        }
    }

猜你喜欢

转载自blog.csdn.net/qq563129582/article/details/130746016