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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:27:10