我试图在我的统一项目中使用一些简单的.NET API。通过手动指定每个字段的名称,我已经能够在API服务器上填充模型(类)。问题是这些模型的内容主要是原始数据类型,主要是ints和字符串。我的模型结构需要嵌套模型(类),例如:
public class Echo
{
public string text { get; set; }
}
public class ComplexData
{
public List<Echo> echo { get; set; }
public string description { get; set; }
}
我有完全相同的模型在团结,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中的截图所示:
我做错了什么?对于标准的统一库来说,这样的事情可能吗?我更愿意坚持UnityWebRequest
或任何类似的库是内置到团结。
下面是两个模型(类)的并排,左边是.NET API,右边是统一:
如能提供任何帮助,将不胜感激。
====================Update=======================
@LukeBriggs
我已经按照如下方式实现了您的代码,再次检查是否正确,在web调用之前添加一个断点,然后再检查一下我实际上是在发送一个填充的模型。
这就是我如何更新我的代码:
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现在通过一个空引用异常,而以前它只显示模型属性/字段为空。截图:
发布于 2019-08-30 22:11:46
内容-类型事项
首先,像对待常规JSON的任何其他客户端一样对待Unity。然后,我们的目标是让Unity发送JSON结构化数据。
提示:您还可以创建一些JSON并将其发布到API中,使用postman、curl等工具,甚至只在web浏览器中使用devtools来测试API方面的内容。
所以,你现在已经很接近了。缺少的关键部分只是标题。在发出POST请求时,必须指定数据的格式是实际发送的--这是由Content-Type
头完成的。标准的默认值是多部分表单内容类型,它不支持这种嵌套数据,但JSON支持。下面是您如何在联合中指定“I‘s POSTing JSON”:
string jsonToSend = JsonUtility.ToJson(complexData);
UnityWebRequest uwr = UnityWebRequest.Post(url, "");
uwr.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(jsonToSend));
uwr.SetRequestHeader("Content-Type", "application/json"); // <--- The missing magic line
yield return uwr.SendWebRequest();
..
FromBody也很重要
在API中,尝试添加FromBody参数属性,如下所示:
public string getComplexData([FromBody] ComplexData complexData)
{
..
}
https://stackoverflow.com/questions/57732369
复制相似问题