Unity Web 请求包装器

Unity Web Request Wrapper

我正在尝试在 UWR 之上制作自己的 JSON Web 请求包装器,因此从一个脚本调试和更改所有网络请求比调试和更改更容易每个场景

但我不知道如何从协程中 return string,谁能帮我一把?

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

namespace Test
{
    public class JSONUtils : MonoBehaviour
    {
        public string GetJSON(string uri)
        {
            // How to return a string from RequestJSON?
            StartCoroutine(RequestJSON(uri));
        }

        private IEnumerator RequestJSON(string url)
        {
            using (UnityWebRequest www = UnityWebRequest.Get(url))
            {
                yield return www.SendWebRequest();

                if (www.isNetworkError || www.isHttpError)
                {
                    Debug.Log(www.error);
                }
                else
                {
                    yield return www.downloadHandler.text;
                }
            }
        }
    }
}

But I don't know how to return a string from a coroutine, can anyone lend me a hand?

不要使函数 return 成为任何东西。只需将其设为 void 函数并将参数用于 return 数据即可。也不要只是 return 请求的正文。 return重要的调试信息如isNetworkErrorisHttpError和请求字符串的error是有意义的`否则你不知道什么时候请求失败或原因失败的原因。

您可以使用 Actiondelegate 执行此操作,但在此示例中我将使用 delegate,因为它允许您命名 callack 参数。

例如,这是使用 delegate 时的样子:

public delegate void ReqCallback(bool isNetworkError, bool isHttpError, string error, string body);

以及 Action 的样子:

public Action<bool, bool, string, string> ReqCallback;

在这种情况下,委托更具描述性。只需将它用作参数,然后在请求完成时调用该委托。

您的 JSONUtils 脚本:

namespace Test
{
    public class JSONUtils : MonoBehaviour
    {
        public delegate void ReqCallback(bool isNetworkError, bool isHttpError, string error, string body);

        public void GetJSON(string uri, ReqCallback callback)
        {
            // How to return a string from RequestJSON?
            StartCoroutine(RequestJSON(uri, callback));
        }

        private IEnumerator RequestJSON(string url, ReqCallback callback)
        {
            using (UnityWebRequest www = UnityWebRequest.Get(url))
            {
                //Send request
                yield return www.SendWebRequest();
                //Return result
                callback(www.isNetworkError, www.isHttpError, www.error, www.downloadHandler.text);
            }
        }
    }
}

用法:

JSONUtils jsonUtils = GetComponent<JSONUtils>();
string url = "yahoo.com";

jsonUtils.GetJSON(url, (isNetworkError, isHttpError, error, body) =>
 {
     Debug.Log("isNetworkError: " + isNetworkError);
     Debug.Log("isHttpError: " + isHttpError);
     Debug.Log("error: " + error);
     Debug.Log("body: " + body);

     if (isNetworkError || isHttpError)
         Debug.Log(error);
     else
         Debug.Log(body);
});

您也可以将 if (isNetworkError || isHttpError) 移到 JSONUtils class 中,但我认为放在 class 之外更好。最后,您还可以使用 class 或结构作为 delegate 中的参数,而不是四种不同的参数数据类型。