无需GraphQL Client:求可将对象转为GraphQL请求的工具
无需完整GraphQL Client的对象转GraphQL请求方案
以下几种方案可以满足你在不使用GraphQL Client或GraphQLHttpRequest的前提下,将填充好的对象转换为GraphQL查询字符串,配合现有HttpClientFactory发送请求:
1. 使用GraphQL-Parser(轻量AST生成库)
这是一个专注于GraphQL语法解析与生成的轻量库,仅处理查询字符串的构建,不包含完整客户端逻辑。你可以通过构建抽象语法树(AST)来生成符合规范的GraphQL查询。
示例代码:
using GraphQLParser; using GraphQLParser.AST; // 构建查询的AST结构 var getUserField = new GraphQLField { Name = new GraphQLName("getUsers"), Arguments = new GraphQLArguments(new List<GraphQLArgument> { new GraphQLArgument { Name = new GraphQLName("filter"), Value = new GraphQLObjectValue(new List<GraphQLObjectField> { new GraphQLObjectField { Name = new GraphQLName("name"), Value = new GraphQLStringValue("John") }, new GraphQLObjectField { Name = new GraphQLName("age"), Value = new GraphQLIntValue(30) } }) } }), SelectionSet = new GraphQLSelectionSet(new List<GraphQLSelection> { new GraphQLField { Name = new GraphQLName("id") }, new GraphQLField { Name = new GraphQLName("email") } }) }; var queryOperation = new GraphQLOperationDefinition { Operation = OperationType.Query, SelectionSet = new GraphQLSelectionSet(new List<GraphQLSelection> { getUserField }) }; // 将AST转换为GraphQL查询字符串 var queryString = queryOperation.ToString();
生成的queryString可直接放入HTTP请求体的query字段中,通过HttpClientFactory发送POST请求。
2. 使用GraphQLQueryGenerator(对象驱动的查询生成)
这个库专门针对C#对象到GraphQL查询的转换,通过反射读取对象属性自动构建查询,无需手动操作AST,更贴合你“填充对象转请求”的需求。
示例代码:
using GraphQLQueryGenerator; // 定义过滤条件类 public class UserFilter { public string Name { get; set; } public int Age { get; set; } } // 定义需要返回的字段类(属性名对应GraphQL字段名) public class UserResponseFields { public string Id { get; set; } public string Email { get; set; } } // 生成查询字符串 var filter = new UserFilter { Name = "John", Age = 30 }; var queryBuilder = new GraphQLQueryBuilder(); var query = queryBuilder.GenerateQuery("getUsers", filter, new UserResponseFields()); // 构造请求体 var requestBody = new { query = query }; // 后续使用HttpClientFactory序列化requestBody为JSON并发送POST请求
3. 手动实现轻量转换工具(无额外依赖)
如果不想引入第三方库,可基于反射实现一个简单的转换工具,适合结构不复杂的查询场景:
示例代码:
public static class GraphQLHelper { public static string GenerateQuery(string operationName, object filter, Type returnFieldsType) { // 生成过滤参数部分 var filterProps = filter.GetType().GetProperties(); var argumentPairs = filterProps.Select(p => $"{p.Name}: {FormatValue(p.GetValue(filter))}" ); var arguments = argumentPairs.Any() ? $"({string.Join(", ", argumentPairs)})" : ""; // 生成返回字段部分 var returnFields = string.Join(" ", returnFieldsType.GetProperties().Select(p => p.Name)); return $"query {operationName}{arguments} {{ {operationName} {{ {returnFields} }} }}"; } private static string FormatValue(object value) { return value switch { string s => $"\"{s}\"", int or float or double or long => value.ToString(), bool => value.ToString().ToLower(), _ => throw new NotSupportedException($"Unsupported value type: {value.GetType()}") }; } } // 使用示例 var filter = new { Name = "John", Age = 30 }; var query = GraphQLHelper.GenerateQuery("getUsers", filter, typeof(UserResponseFields));
你可以根据实际需求扩展这个工具,比如处理嵌套对象、枚举类型等。
内容的提问来源于stack exchange,提问作者James Andrew Smith
相关产品推荐
相关产品推荐

