Skip to main content
 首页 » 编程设计

c#之Unity Web 请求包装器

2024年02月25日35soundcode

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

但是我不知道如何从协程返回一个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?

不要让函数返回任何东西。只需将其设为 void 函数并使用参数返回数据即可。也不要只返回请求的主体。返回isNetworkError、isHttpError 和请求字符串的error 等重要的调试信息是有意义的`否则你不知道什么时候请求失败或失败原因。

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

例如,使用 delegate 时的样子:

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

Action 看起来像什么:

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

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

您的 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 类中,但我认为将它放在该类之外会更好。最后,您还可以使用类或结构作为 delegate 中的参数,而不是四种不同的参数数据类型。