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错误
修复步骤
- 构造JSON格式的请求体:将GraphQL的
query和variables包装成标准JSON对象 - 使用
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
相关产品推荐
相关产品推荐

