【发布时间】:2019-08-30 19:35:08
【问题描述】:
我正在尝试在我的 Unity 项目中使用一些简单的 .NET API。通过手动指定每个字段的名称,我已经能够在 API 服务器上填充模型(类)。问题是这些模型的内容主要是原始数据类型,主要是整数和字符串。我的模型结构将需要嵌套模型(类),例如:
public class Echo
{
public string text { get; set; }
}
public class ComplexData
{
public List<Echo> echo { get; set; }
public string description { get; set; }
}
我在 Unity 中有完全相同的模型,serializable,并且没有 getter 和 setter,因为这是我在研究中看到的。
所以这是我用来发送这个模型的代码,它在发送到这个函数之前填充(并通过断点确认)。
请记住,我尝试过 WWWForm、Dictionary 和 IMultipartFormSection
数据类型无济于事。我将它们留在代码中只是为了演示我迄今为止所做的尝试:
IEnumerator sendComplexModel(string url, ComplexData complexData)
{
string complex = JsonUtility.ToJson(complexData);
WWWForm form = new WWWForm();
form.AddField("complexData", complex);
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
keyValuePairs.Add("complexData", complex);
List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("complexData", complex));
UnityWebRequest uwr = UnityWebRequest.Post(url, formData);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Something went wrong");
}
else
{
Debug.Log(uwr.downloadHandler.text);
}
}
您可以假设我已经更新了参数:UnityWebRequest uwr = UnityWebRequest.Post(url, formData); 以使用我在上面创建的相关数据结构进行测试
UnityWebRequest 的每个重载函数都将 null 传递给 .NET,如 Visual Studio 的此屏幕截图所示:
我做错了什么?使用标准的 Unity 库是否可以实现这样的功能?我宁愿坚持使用 UnityWebRequest 或 Unity 中内置的任何类似库。
这是两个模型(类)的并排,左边是 .NET API,右边是 Unity:
任何帮助将不胜感激,在此先感谢。
=====================更新=======================
@LukeBriggs
我已经按如下方式实现了您的代码,再次进行完整性检查,在网络调用之前添加一个断点以仔细检查我实际上是在发送一个填充模型。
这就是我更新代码的方式:
string complex = JsonUtility.ToJson(complexData);
UnityWebRequest uwr = UnityWebRequest.Post(url, complex);
uwr.SetRequestHeader("Content-Type", "application/json");
yield return uwr.SendWebRequest();
if (uwr.isNetworkError)
{
Debug.Log("Something went wrong");
}
else
{
Debug.Log(uwr.downloadHandler.text);
}
Visual Studio 现在通过空引用异常,而以前它只会显示模型属性/字段为空。截图:
【问题讨论】:
-
您的语言有点混乱..“模型”您似乎实际上指的是
classes,而那些不是“函数”而是“字段” -
@derHugo 抱歉,我在编辑中澄清了我对函数的使用。术语模型只是 MVC 编码模式中一个类的特定用途,我的 API 是在其中构建的,我只是在我的 Unity 项目中继续这种编码模式。
-
也只是一个一般性的旁注:可能希望避免调用诸如“ComplexData”之类的东西,因为随着项目的增长,它会很快变得混乱。始终以它们所代表的内容命名你的类。 “UserProfileData”等
-
太棒了-只是想确定一下:P
-
针对您的编辑更新了答案 - 在您的代码中发现了其他内容:)
标签: c# asp.net visual-studio rest unity3d