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 上,并将其托管在没有服务器功能的服务器上 :)
我正在寻找对 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 上,并将其托管在没有服务器功能的服务器上 :)