C#中使用GraphQLHttpClient调用Rubrik GraphQL API返回null数据的问题及解决方法
C#中使用GraphQLHttpClient调用Rubrik GraphQL API返回null数据的问题及解决方法
最近我在尝试用C#的GraphQL客户端库(包括GraphQL.Client.Abstractions、Client.Serializer.SystemTextJson等)调用Rubrik备份系统的GraphQL API,感觉离成功只差一步,但最后返回的数据一直是null,折腾了好久终于找到了解决办法,分享给大家:
我的初始配置与代码
首先我配置了GraphQLHttpClient的选项:
GraphQLHttpClientOptions options = new GraphQLHttpClientOptions(); options.MediaType = "application/json"; options.EndPoint = new Uri("https://example.com/api/graphql");
接着创建客户端并添加认证头和其他请求头:
GraphQLHttpClient graphClient = new GraphQLHttpClient(options, new GraphQL.Client.Serializer.SystemTextJson.SystemTextJsonSerializer()); graphClient.HttpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); graphClient.HttpClient.DefaultRequestHeaders.Add("Accept", "*/*"); graphClient.HttpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
然后定义了GraphQL查询语句:
string query = @"query HypervServersQuery($input: QueryHypervHostInput!) { hypervServers(input: $input) { data { hostname serverName id __typename } __typename } }";
以及对应的变量:
var variables_ = new { name = "xxx", primaryClusterId = "xxx", clusterUuid = "xxx" }; var variables = new { input = variables_ };
最后发送查询请求,一开始我是这么写的:
GraphQLRequest query = new GraphQLRequest { Query = query , Variables = variables }; var result = graphClient.SendQueryAsync<DataResponse>(query).GetAwaiter().GetResult();
遇到的问题
请求的状态码是OK(之前还遇到过Bad Request,调整格式后解决了),但返回的result.Data一直是null。我确认了同样的查询语句和变量在PowerShell里是能正常返回数据的,所以问题肯定出在C#的处理逻辑上。
解决方法
最后发现问题出在返回数据的反序列化环节——我自定义的DataResponse类和Rubrik API返回的实际数据结构可能存在不匹配的情况(比如嵌套字段、__typename这类字段的处理)。换成dynamic类型来接收响应数据后,就可以正确获取到返回的内容了:
GraphQLResponse<dynamic> graphQLResponse = graphQLClient.SendQueryAsync<dynamic>(query).GetAwaiter().GetResult();
备注:内容来源于stack exchange,提问作者Stephen Van Wiele
相关产品推荐
相关产品推荐

