UnityWebRequest.Put 不发送 JSON 字符串

UnityWebRequest.Put doesn't send JSON string

我正在寻找对 API 我已经部署到使用 NEXT JS 构建的 Vercel 的 PUT 或 POST 请求。除了成为 API 之外,它还做其他事情,但这并不重要...

所以,我有一个 Unity 项目,我想在其中记录我的玩家完成他们所在关卡的时间。 最初我想使用 Firebase 但发现我不能,因为 Windows Unity 构建不支持它所以我最终只是制作了一个 API 将数据发送到 MongoDB 和做一些其他的事情,同样不重要。

所以进入问题的核心:

我有这个 IEnumerator 来发送请求:

IEnumerator logPlayerTime()
{
    string url = "http://some-vercel-cloud-function/api/new";
    var requestBody = new PlayerRequestBody();
    requestBody.firstName = "John";
    requestBody.lastName = "Doe";
    requestBody.email = "email@email.com";
    requestBody.marketing = false;
    requestBody.time = 200000;  // this actually come from somewhere else but for now this is fine

    string json = JsonUtility.ToJson(requestBody);

    UnityWebRequest request = UnityWebRequest.Put(url, json);
    request.SetRequestHeader("Content-Type", "application/json");
    request.SetRequestHeader("Accept", "*/*");
    request.SetRequestHeader("Accept-Encoding", "gzip, deflate, br");
    request.SetRequestHeader("Connection", "keep-alive");
    request.useHttpContinue = false;
    yield return request.SendWebRequest();

    if (request.result != UnityWebRequest.Result.Success)
    {
        Debug.Log(request.error);
    }
    else
    {
        Debug.Log("Time Logged! " + json);
    }
}

根据 Docs 我应该有两个参数,第一个是我的 URL,第二个是我的数据。

至于JSON我要发这个struct

[Serializable]
private struct PlayerRequestBody
{
    public string firstName;
    public string lastName;
    public string email;
    public bool marketing;
    public float time;
}

然后,我使用 JsonUtiltiy.ToJson 将我的 json 变量转换为 JSON 字符串,这似乎有效。

综上所述,无论我在请求中更改什么,即使手动输入 JSON 字符串也进行了转义。它只是发送一个空 JSON 对象的请求主体,如下所示:

{}

因此,如果我们看一下 API 收到的日志,如下所示:

[PUT] /api/new    01:44:25:13    {}

我敢肯定这是个小问题,但我没有足够的 Unity 或 C# 经验来发现问题(我想睡觉)。

至于如何调用它,在我的一个管理游戏的脚本中,我有一个订阅 GameState 更改的处理程序方法,所以当我的 GameState === GameState.Victory 然后我会 运行 处理程序。因此,为了便于阅读而删除了一些位的代码如下所示:

// ...
private void Awake()
{
    GameManager.OnGameStateChanged += GameManager_OnGameStateChanged;
}
// ...
private void GameManager_OnGameStateChanged(GameState state)
{
    
    if (state == GameState.Victory)
    {
        handleVictory();
    }

}

handleVictory 方法目前只是 运行IEnumerator 上的 StartCoroutine

有什么想法吗?提前致谢

所以对于任何以某种方式遇到这个问题的人来说,答案是......接下来很奇怪。

我使用 Express JS 和来自播放器的 boom 即时数据制作了另一个 API。

我没有时间研究它,但 Unity 的 UnityWebRequest 一定有一些 Next 不同意的地方。长话短说,我要把 API 从 next 中拉出来,然后将我的组件移到 React 上,并将其托管在没有服务器功能的服务器上 :)