Unity Web请求包装器

时间:2018-03-31 03:40:54

标签: c# web-services unity3d wrapper

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

1 个答案:

答案 0 :(得分:2)

  

但我不知道如何从协程中返回一个字符串,任何人都可以   借给我一个手?

不要让函数返回任何内容。只需将其设为void函数,然后使用该参数返回数据。也不要只返回请求的正文。返回重要的调试信息(如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课程中,但我认为将其放在该课程之外会更好。最后,您还可以使用类或结构作为delegate中的参数,而不是四种不同的参数数据类型。