首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在UnityWebRequest上发送“复杂”模型数据

在UnityWebRequest上发送“复杂”模型数据
EN

Stack Overflow用户
提问于 2019-08-30 19:35:08
回答 1查看 1K关注 0票数 1

我试图在我的统一项目中使用一些简单的.NET API。通过手动指定每个字段的名称,我已经能够在API服务器上填充模型(类)。问题是这些模型的内容主要是原始数据类型,主要是ints和字符串。我的模型结构需要嵌套模型(类),例如:

代码语言:javascript
运行
复制
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,这是我在我的研究中看到的。

这就是我用来发送这个模型的代码,这个模型在被发送到这个函数之前被填充(并由一个断点确认)。请记住,我尝试过WWWFormDictionaryIMultipartFormSection数据类型,但没有结果。我将它们留在代码中只是为了演示我迄今尝试过的内容:

代码语言:javascript
运行
复制
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调用之前添加一个断点,然后再检查一下我实际上是在发送一个填充的模型。

这就是我如何更新我的代码:

代码语言:javascript
运行
复制
    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现在通过一个空引用异常,而以前它只显示模型属性/字段为空。截图:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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”:

代码语言:javascript
运行
复制
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参数属性,如下所示:

代码语言:javascript
运行
复制
public string getComplexData([FromBody] ComplexData complexData)
{
..
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57732369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档