UnityWebRequest.Post成功创建数据库条目但所有字段值为null
问题根因
你代码的核心错误是请求体格式和声明的Content-Type完全不匹配:
WWWForm生成的请求体是multipart/form-data格式,你强行把Content-Type改成application/json/text/json,后端按JSON规则解析表单内容,根本读不到任何字段,只能用空值创建条目。- 你之前测试纯JSON传参时,大概率没有直接把JSON字符串作为请求体上传,要么还是套了WWWForm,要么Content-Type设置错误,才会复现问题。
- 额外提醒:
Access-Control-Allow-*是后端返回的响应头,你在客户端请求里加这些头毫无作用,反而可能触发异常的OPTIONS预检请求,直接删掉即可。
方案1:纯JSON传参(和Postman测试逻辑一致,优先使用)
你已经验证过同一份JSON在Postman里可以正常写入,直接对齐Postman的请求逻辑即可,不需要把JSON反序列化后再转表单,代码如下:
public static IEnumerator SendUserData(string json) { string targetUrl = url + "/user/create"; // 直接传入JSON字符串,指定Content-Type为application/json using (UnityWebRequest req = UnityWebRequest.Post(targetUrl, json, "application/json")) { // 仅添加Parse服务要求的鉴权请求头 req.SetRequestHeader("X-Parse-Application-Id", "AppId"); req.SetRequestHeader("X-Parse-REST-API-Key", "RestKey"); yield return req.SendWebRequest(); if (req.isHttpError || req.isNetworkError) { Debug.LogError($"请求失败,状态码:{req.responseCode},错误信息:{req.error},后端返回:{req.downloadHandler.text}"); } else { Debug.Log($"数据上传成功,后端返回:{req.downloadHandler.text}"); } } }
方案2:标准WWWForm表单传参
如果你需要用表单格式传参,不要手动修改Content-Type,让Unity自动生成带boundary参数的multipart/form-data请求头即可,代码如下:
public static IEnumerator SendUserDataWithForm(string json) { string targetUrl = url + "/user/create"; WWWForm form = new WWWForm(); User_Data data = JsonUtility.FromJson<User_Data>(json); // 值类型字段转字符串传入,避免AddField重载匹配异常 form.AddField("id", data.id.ToString()); form.AddField("age", data.age.ToString()); form.AddField("location", data.location); form.AddField("gender", data.gender); form.AddField("nationality", data.nationality); form.AddField("language", data.language); using (UnityWebRequest req = UnityWebRequest.Post(targetUrl, form)) { // 添加鉴权头,不要修改Content-Type,不要加CORS相关请求头 req.SetRequestHeader("X-Parse-Application-Id", "AppId"); req.SetRequestHeader("X-Parse-REST-API-Key", "RestKey"); yield return req.SendWebRequest(); if (req.isHttpError || req.isNetworkError) { Debug.LogError($"请求失败,状态码:{req.responseCode},错误信息:{req.error},后端返回:{req.downloadHandler.text}"); } else { Debug.Log($"表单上传成功,后端返回:{req.downloadHandler.text}"); } } }
排查提示
如果替换代码后仍有问题,直接打印req.downloadHandler.text查看后端返回的具体报错信息,比仅判断网络错误精准得多。你之前能成功创建空条目,说明请求已经正常到达后端,只是参数解析环节出错,对齐请求体格式和Content-Type后即可正常写入字段。
内容的提问来源于stack exchange,提问作者Elias Ioannou
相关产品推荐
相关产品推荐

