You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:35:05