Unity - UnityWebRequest辅助类

Unity - UnityWebRequest辅助类

Unity中对Http请求提供了UnityWebRequest 和 WWW
最常用的是 UnityWebRequest.Get 和 UnityWebRequest.Post
为避免使用UnityWebRequest时重复编写代码,现对常用的方法进行封装,分为对 协程 的实现方法和对 UniTask 的实现方法,按自身需求选择其一即可

协程

using System;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine;

public static class UnityWebRequestHelper
{
    
    
    //保证传入参数不为空
    static void ParamsCheck(string url, object @object)
    {
    
    
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");

        if (@object is null)
            throw new ArgumentNullException("@object");
    }

    /// <summary>
    /// 获取字符串
    /// </summary>
    /// <param name="onSuccess">请求成功时调用返回数据</param>
    /// <param name="onFail">请求失败时调用返回数据</param>
    public static IEnumerator Get(string url, Action<string> onSuccess, Action onFail = null)
    {
    
    
        ParamsCheck(url, onSuccess);

        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
    
    
            yield return request.SendWebRequest();
            if (request.result != UnityWebRequest.Result.Success)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。");
                onFail?.Invoke();
                yield break;
            }
            onSuccess(request.downloadHandler.text);
        }
    }

    /// <summary>
    /// 获取数据流
    /// </summary>
    /// <param name="onSuccess">请求成功时调用返回数据</param>
    /// <param name="onFail">请求失败时调用返回数据</param>
    public static IEnumerator Get(string url, Action<byte[]> onSuccess, Action onFail = null)
    {
    
    
        ParamsCheck(url, onSuccess);

        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
    
    
            yield return request.SendWebRequest();
            if (request.result != UnityWebRequest.Result.Success)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。");
                onFail?.Invoke();
                yield break;
            }
            onSuccess(request.downloadHandler.data);
        }
    }

    /// <summary>
    /// 获取字符串
    /// </summary>
    /// <param name="onSuccess">请求成功时调用返回数据</param>
    /// <param name="onFail">请求失败时调用返回数据</param>
    public static IEnumerator Post(string url, WWWForm form, Action<string> onSuccess, Action onFail = null)
    {
    
    
        ParamsCheck(url, onSuccess);

        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
    
    
            yield return request.SendWebRequest();
            if (request.result != UnityWebRequest.Result.Success)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。");
                onFail?.Invoke();
                yield break;
            }
            onSuccess(request.downloadHandler.text);
        }
    }

    /// <summary>
    /// 获取数据流
    /// </summary>
    /// <param name="onSuccess">请求成功时调用返回数据</param>
    /// <param name="onFail">请求失败时调用返回数据</param>
    public static IEnumerator Post(string url, WWWForm form, Action<byte[]> onSuccess, Action onFail = null)
    {
    
    
        ParamsCheck(url, onSuccess);

        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
    
    
            yield return request.SendWebRequest();
            if (request.result != UnityWebRequest.Result.Success)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。");
                onFail?.Invoke();
                yield break;
            }
            onSuccess(request.downloadHandler.data);
        }
    }
}

调用示例:

using UnityEngine;

public class TestUWRHelper : MonoBehaviour
{
    
    
    void Awake()
    {
    
    
        StartCoroutine(UnityWebRequestHelper.Get("baidu.com", LogString));
    }

    void LogString(string str)
    {
    
    
        Debug.Log(str);
    }
}

UniTask

UniTask插件:https://github.com/Cysharp/UniTask

using System;
using UnityEngine.Networking;
using UnityEngine;
using Cysharp.Threading.Tasks;

public static class UnityWebRequestHelper
{
    
    
    /// <summary>
    /// 获取字符串
    /// </summary>
    /// <returns>响应结果的字符串 当请求失败时为Null</returns>
    /// <exception cref="ArgumentNullException">url为空</exception>
    public static async UniTask<string> GetString(string url) => await Get(url) as string;

    /// <summary>
    /// 获取数据流
    /// </summary>
    /// <returns>响应结果的数据流 当请求失败时为Null</returns>
    /// <exception cref="ArgumentNullException">url为空</exception>
    public static async UniTask<byte[]> GetBytes(string url) => await Get(url, ResultType.Bytes) as byte[];

    /// <summary>
    /// 获取AssetBundle
    /// </summary>
    /// <returns>响应下载的AssetBundle 当请求失败时为Null</returns>
    /// <exception cref="ArgumentNullException">url为空</exception>
    public static async UniTask<AssetBundle> GetAssetBundle(string url)
    {
    
    
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");

        using (UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url))
        {
    
    
            try
            {
    
    
                await request.SendWebRequest();
                return (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
            }
            catch (Exception e)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。\n{e.Message}");
                return null;
            }
        }
    }

    /// <summary>
    /// 获取字符串
    /// </summary>
    /// <param name="url"></param>
    /// <returns>响应结果的字符串 当请求失败时为Null</returns>
    /// <exception cref="ArgumentNullException">url为空</exception>
    public static async UniTask<string> Post4String(string url, WWWForm form) => await Post(url, form, ResultType.String) as string;

    /// <summary>
    /// 获取数据流
    /// </summary>
    /// <returns>响应结果的数据流 当请求失败时为Null</returns>
    /// <exception cref="ArgumentNullException">url为空</exception>
    public static async UniTask<byte[]> Post4SBytes(string url, WWWForm form) => await Post(url, form, ResultType.Bytes) as byte[];
    
    enum ResultType
    {
    
    
        String,
        Bytes
    }

    //Get重复部分代码
    static async UniTask<object> Get(string url, ResultType type = ResultType.String)
    {
    
    
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");

        using (UnityWebRequest request = UnityWebRequest.Get(url))
        {
    
    
            try
            {
    
    
                await request.SendWebRequest();
                var handler = request.downloadHandler;
                return type == ResultType.String ? handler.text : handler.data;
            }
            catch (Exception e)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。\n{e.Message}");
                return null;
            }
        }
    }

    //Post重复部分代码
    static async UniTask<object> Post(string url, WWWForm form, ResultType type = ResultType.String)
    {
    
    
        if (string.IsNullOrEmpty(url))
            throw new ArgumentNullException("url");

        if (form is null)
            throw new ArgumentNullException("form");

        using (UnityWebRequest request = UnityWebRequest.Post(url, form))
        {
    
    
            try
            {
    
    
                await request.SendWebRequest();
                var handler = request.downloadHandler;
                return type == ResultType.String ? handler.text : handler.data;
            }
            catch (Exception e)
            {
    
    
                Debug.LogError($"对 {url} 请求失败。\n{e.Message}");
                return null;
            }
        }
    }
}

调用示例:

using UnityEngine;

public class TestUWRHelper : MonoBehaviour
{
    
    
    async void Awake()
    {
    
    
        LogString(await UnityWebRequestHelper.GetString("baidu.com"));
    }

    void LogString(string str)
    {
    
    
        Debug.Log(str);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43430402/article/details/129195201