调用Unity WebRequest请求OpenAI API异常:Editor正常WebGL参数缺失
核心问题定位
编辑器与WebGL平台的HTTP请求处理、序列化机制存在差异,导致请求参数(尤其是model字段)未正确传递到OpenAI API;WebGL下Debug.Log(result)为空,是因为Unity WebGL的日志输出逻辑和编辑器不同。
具体排查与修复步骤
1. 替换请求参数序列化方式
Unity默认的JsonUtility在WebGL环境下对嵌套对象、特殊字符的处理存在兼容性问题,改用Newtonsoft.Json(需导入Unity官方提供的Newtonsoft.Json包)序列化请求payload:
// 替换原JsonUtility.ToJson代码 string payloadJson = Newtonsoft.Json.JsonConvert.SerializeObject(chatCompletionRequest);
确保序列化后的JSON字符串包含明确的"model": "gpt-3.5-turbo"(或你使用的目标模型ID)字段。
2. 强制设置请求Content-Type
WebGL下发送POST请求时,必须明确指定Content-Type为application/json,否则OpenAI API无法正确解析参数:
UnityWebRequest request = UnityWebRequest.Post(apiUrl, payloadJson); request.SetRequestHeader("Content-Type", "application/json"); request.SetRequestHeader("Authorization", "Bearer " + apiKey);
3. 调试WebGL下的实际请求内容
WebGL的Debug.Log无法直接输出完整请求内容,可通过浏览器控制台查看:
在发送请求前添加以下代码,将序列化后的JSON字符串传递给浏览器控制台打印:
#if UNITY_WEBGL && !UNITY_EDITOR Application.ExternalCall("console.log", "Request Payload: " + payloadJson); #endif
通过Chrome控制台确认实际发送的参数是否包含model字段。
4. 处理跨域请求限制
若WebGL部署在本地或非OpenAI允许的域名下,跨域限制会导致请求被拦截,参数无法正常传递。可通过以下方式解决:
- 在Unity项目中配置CORS相关设置;
- 在部署服务器上搭建反向代理,将OpenAI API请求转发到同源地址。
5. 验证API密钥的正确性
确保WebGL环境下API密钥未被过滤或加载异常,可通过上述Application.ExternalCall方式临时输出密钥(注意生产环境需删除该调试代码)。
验证修复
修改完成后,构建WebGL版本并在Chrome中运行,通过控制台确认请求payload包含正确的model字段,再调用API即可解决「Provide Model Parameter」错误。
内容的提问来源于stack exchange,提问作者Wasim Akhtar Khan

