Unity – UnityWebRequest-Hilfsklasse

Unity – UnityWebRequest-Hilfsklasse

Unity stellt UnityWebRequest und WWW für HTTP-Anfragen bereit.
Die am häufigsten verwendeten sind UnityWebRequest.Get und UnityWebRequest.Post
. Um bei der Verwendung von UnityWebRequest das wiederholte Schreiben von Code zu vermeiden, sind gängige Methoden jetzt gekapselt und in Methoden zur Implementierung von Coroutinen und Methoden für UniTask unterteilt .Implementierungsmethode, Sie können eine entsprechend Ihren eigenen Anforderungen auswählen

Coroutine

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);
        }
    }
}

Aufrufbeispiel:

using UnityEngine;

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

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

UniTask

UniTask-Plugin: 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;
            }
        }
    }
}

Aufrufbeispiel:

using UnityEngine;

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

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

Guess you like

Origin blog.csdn.net/weixin_43430402/article/details/129195201