Unity中向OpenAI发送Post请求返回400错误的原因
问题根因
返回400 Bad Request是三个基础配置错误导致的:
- 请求格式完全不匹配:你用
WWWForm构造的是multipart/form-data类型的表单请求体,却手动将Content-Type请求头设置为application/json;且Unity中传入WWWForm调用UnityWebRequest.Post时,会自动覆盖你手动设置的Content-Type头,最终发给OpenAI的请求头和请求体格式完全不符,接口无法解析直接报错。 - 参数类型不符合接口要求:
temperature字段接口要求传入0~2之间的浮点数,你代码中把该变量定义为string类型,传字符串过去会直接触发参数校验失败。 - 调试信息不全:现有代码只打印了Unity层面的网络错误,没有输出OpenAI返回的具体错误文本,不利于定位具体参数问题。
修复代码
不要用WWWForm构造表单,直接序列化JSON格式的原始请求体发送即可,以下是可直接运行的修正版本:
using UnityEngine; using UnityEngine.Networking; using System.Text; using System; // 用于序列化请求参数的实体类 [Serializable] public class OpenAICompletionRequest { public string model; public string prompt; public int max_tokens; public float temperature; } public class gpt3_complete : MonoBehaviour { [Header("请求参数配置")] public string model = "text-davinci-003"; public string prompt = "测试prompt"; public int maxTokens = 128; [Range(0f, 2f)] public float temperature = 0.5f; public string apiKey = "替换为你的实际API Key"; void Start() { StartCoroutine(CallGPTAPI()); } IEnumerator CallGPTAPI() { // 构造请求参数并序列化为JSON OpenAICompletionRequest requestParams = new OpenAICompletionRequest { model = model, prompt = prompt, max_tokens = maxTokens, temperature = temperature }; string jsonBody = JsonUtility.ToJson(requestParams); byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonBody); // 构造POST请求 using (UnityWebRequest request = new UnityWebRequest("https://api.openai.com/v1/completions", "POST")) { request.uploadHandler = new UploadHandlerRaw(bodyRaw); request.downloadHandler = new DownloadHandlerBuffer(); // 设置正确的请求头 request.SetRequestHeader("Authorization", $"Bearer {apiKey}"); request.SetRequestHeader("Content-Type", "application/json"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { // 打印完整错误信息方便调试 Debug.LogError($"请求失败,状态码:{request.responseCode}\nUnity错误:{request.error}\n接口返回:{request.downloadHandler.text}"); } else { Debug.Log($"请求成功,返回内容:{request.downloadHandler.text}"); } } } }
额外注意事项
- 正式发布游戏时绝对不能把API Key硬编码在客户端代码里,必须搭建自己的中转服务端,由服务端保管Key、转发OpenAI请求,否则客户端被逆向之后Key会被盗取,产生高额欠费。
- 上述代码仅适配旧版补全接口(对应text-davinci-003等GPT-3基础模型),如果要调用GPT-3.5/4系列对话模型,需要更换请求地址、调整请求体结构。
- 编辑器下测试要确认本地网络可以正常访问OpenAI服务,同时Player Settings中没有配置错误的网络代理拦截请求。
内容的提问来源于stack exchange,提问作者Dadu Khan
相关产品推荐
相关产品推荐

