Unity中UnityWebRequest发送PUT请求报400无效JSON错误求助
解决UnityWebRequest PUT请求返回400无效JSON的问题
以下是针对该问题的排查和解决方案:
1. 排除UTF-8 BOM干扰
部分服务器无法处理带BOM(字节顺序标记)的UTF-8数据,而System.Text.Encoding.UTF8.GetBytes()默认可能会添加BOM。替换编码方式为无BOM的UTF-8:
// 替换原编码代码 byte[] jsonToSend = new System.Text.UTF8Encoding(false).GetBytes(json);
2. 统一JSON序列化格式
确保序列化后的JSON格式与服务器期望完全匹配,比如使用驼峰命名、去掉多余缩进:
// 修改序列化逻辑,添加驼峰命名配置 var jsonSettings = new Newtonsoft.Json.JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), Formatting = Newtonsoft.Json.Formatting.None // 去掉缩进,避免潜在的空格解析问题 }; string json = Newtonsoft.Json.JsonConvert.SerializeObject(gameEndData, jsonSettings);
3. 验证GameEndData类的字段映射
检查你的GameEndData类定义,确保所有字段名称、类型与服务器API要求一致,必要时使用JsonProperty属性强制指定字段名:
public class GameEndData { [Newtonsoft.Json.JsonProperty("gameId")] public string GameId { get; set; } [Newtonsoft.Json.JsonProperty("used")] public UsedBoosts Used { get; set; } // 其他嵌套类和字段同理配置... }
4. 确认请求头与上传处理器配置
补充设置UploadHandler的ContentType,并避免请求头重复配置:
using (UnityWebRequest request = new UnityWebRequest(apiUrl, "PUT")) { request.uploadHandler = new UploadHandlerRaw(jsonToSend); request.downloadHandler = new DownloadHandlerBuffer(); // 显式设置上传处理器的ContentType request.uploadHandler.contentType = "application/json"; request.SetRequestHeader("session-token", sessionToken); yield return request.SendWebRequest(); // 后续逻辑不变... }
5. 抓包验证实际发送的请求内容
使用Charles、Fiddler等工具抓包,对比Unity发送的JSON与Postman中成功的请求内容,重点检查:
- 是否存在隐藏控制字符
- JSON结构(字段顺序、引号格式)是否完全一致
- 请求头参数是否与Postman完全匹配
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

