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

Unity使用System.Net.Http发送GraphQL请求报错的技术咨询

问题解决:Unity中HttpClient发送GraphQL请求的错误修复

你的错误根源是请求体格式和Content-Type不符合GraphQL服务的要求:

  • 你当前使用FormUrlEncodedContent发送表单编码的数据,而绝大多数GraphQL服务只接受application/json格式的请求体
  • 服务无法识别表单编码的内容,因此返回POST body missing, invalid Content-Type, or JSON object has no keys错误

修复步骤

  1. 构造JSON格式的请求体:将GraphQL的query和variables包装成标准JSON对象
  2. 使用StringContent传递JSON内容,并显式设置Content-Type为application/json

修改后的完整代码

// 可选:定义一个类用于序列化GraphQL请求(推荐,避免手动拼JSON出错)
public class GraphQLRequest
{
    public string query;
    public object variables;
}

static async Task<string> getEntityID(string path)
{
    // 初始化请求对象
    var graphqlRequest = new GraphQLRequest
    {
        query = "query {topLevelEntityTypes {id}}",
        variables = new {} // 空变量对象
    };

    // 序列化对象为JSON字符串(Unity可用JsonUtility或System.Text.Json)
    string jsonBody = JsonUtility.ToJson(graphqlRequest);
    // 或者手动拼接JSON(适合简单场景)
    // string jsonBody = "{\"query\":\"query {topLevelEntityTypes {id}}\",\"variables\":{}}";

    // 创建JSON内容,设置正确的Content-Type
    var content = new StringContent(jsonBody, System.Text.Encoding.UTF8, "application/json");
    
    var response = await client.PostAsync("http://localhost:4000/graphql", content);
    var responseString = await response.Content.ReadAsStringAsync();

    Debug.Log(responseString);
    return responseString;
}

额外注意事项

  • 确保client(HttpClient实例)已正确初始化,比如在Unity的Start方法中实例化:client = new HttpClient();
  • 如果你的Unity版本较低不支持System.Text.Json,用JsonUtility即可,它能直接序列化上述GraphQLRequest类的public字段
  • 异步方法在Unity中调用时,要注意上下文:Debug.Log可在子线程调用,但UI相关操作必须切回主线程执行

内容的提问来源于stack exchange,提问作者Isaac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:01:04