UnityWebRequest.Put 不发送 JSON 字符串



我希望对我部署到使用NEXT JS构建的Vercel的API进行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);
}
}

根据文档,我应该有两个参数,第一个是我的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。胜利了,我就会跑去处理。因此,为了便于阅读,删除了一些位的代码是这样的:

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

if (state == GameState.Victory)
{
handleVictory();
}
}

handleVictory方法现在只是在IEnumerator上运行StartCoroutine

任何想法?提前感谢

你需要在url后面加上/,所以你的url应该是:

string url = "http://some-vercel-cloud-function/api/new/";

对于任何遇到这种情况的人来说,答案是…下一个很奇怪

我使用Express JS制作了另一个API,并从播放器中获取即时数据。

我没有时间去研究它,但是一定有一些关于unity的UnityWebRequest是Next不同意的。总之,我要把API从下一步中拉出来,然后把我的组件移到React上,并把它托管在一个服务器less功能上:)

最新更新