我正在尝试在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;
}
}
}
}
}
答案 0 :(得分:2)
但我不知道如何从协程中返回一个字符串,任何人都可以 借给我一个手?
不要让函数返回任何内容。只需将其设为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;
在这种情况下,委托更具描述性。只需将其用作参数,然后在请求完成时调用该委托。
您的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
中的参数,而不是四种不同的参数数据类型。