【问题标题】:Unity Web Request WrapperUnity Web 请求包装器
【发布时间】:2018-09-10 01:26:58
【问题描述】:

我正在尝试在 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;
                }
            }
        }
    }
}

【问题讨论】:

标签: c# web-services unity3d wrapper


【解决方案1】:

但是我不知道如何从协程返回一个字符串,任何人都可以 帮我一把?

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

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

例如,使用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 中的参数,而不是四种不同的参数数据类型。

【讨论】:

  • 我不知道我能做到这一点.. 谢谢你给我看
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多