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

无需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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:34:50