我希望对我部署到使用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功能上:)