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重要的调试信息如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
class 中,但我认为放在 class 之外更好。最后,您还可以使用 class 或结构作为 delegate
中的参数,而不是四种不同的参数数据类型。
我正在尝试在 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重要的调试信息如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
class 中,但我认为放在 class 之外更好。最后,您还可以使用 class 或结构作为 delegate
中的参数,而不是四种不同的参数数据类型。