• ASP.NET Core中使用GraphQL


    前言#

    你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中,我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。

    使用GraphQL的声明式查询,你可以自定义API返回的属性列表。这与REST API中每个API只返回固定字段不同。

    安装GraphQL#

    为了在C#中使用GraphQL, GraphQL社区中提供了一个开源组件graphql-dotnet。本系列博客中我们都将使用这个组件。

    首先我们创建一个空的ASP.NET Core App

    Copy
    dotnet new web --name chatper1

    然后我们添加对graphql-dotnet库的引用

    Copy
    dotnet add package GraphQL

    创建第一个Query#

    下面我们来创建一个query类, 我们将它命名为HelloWorldQuerygraphql-dotnet中,查询类都需要继承ObjectGraphType类,所以HelloWorldQuery的代码如下

    Copy
    using GraphQL.Types;
    public class HelloWorldQuery : ObjectGraphType
    {
        public HelloWorldQuery()
        {
            Field<StringGraphType>(
                name: "hello",
                resolve: context => "world"
            );
        }
    }

    这里你可能注意到我们使用了一个泛型方法Field,并传递了一个GraphQL的字符串类型StringGraphType来定义了一个hello字段, resolve 参数是一个Func委托,在其中定义了如何返回当前字段的值,这里我们是直接返回了一个字符串hello。

    查询类中的返回字段都是定义在查询类的构造函数中的

    现在我们一个有了一个查询类,下一步我们需要使用这个查询类构建一个结构(schema)。

    Startup.cs文件的Configure方法中,使用以下代码替换原有代码

    Copy
    var schema = new Schema {
        Query = new HelloWorldQuery() 
    };
    
    app.Run(async (context) =>
    {
        var result = await new DocumentExecuter()
            .ExecuteAsync(doc =>
            {
                doc.Schema = schema;
                doc.Query = @"
                    query {
                        hello
                    }
                ";
            }).ConfigureAwait(false);
    
        var json = new DocumentWriter(indent: true)
            .Write(result)
        await context.Response.WriteAsync(json);
    });
    • DocumentExecuter 类的ExecuteAsync方法中我们定义Action委托,并通过这个委托设置了一个ExecutionOptions对象。这个对象初始化了我们定义的结构(schema), 并执行了我们定义的查询字符串。
    • doc.Query定义了一个查询字符串
    • 最终查询执行的结果会通过DocumentWriter类实例的Write被转换成一个JSON字符串

    下面我们来运行一下这个程序

    Copy
    dotnet run

    你将在浏览器中看到以下结果

    Copy
    {
      "data": {
        "hello": "world"
      }
    }

    从以上的例子中,你会发现使用GraphQL并不像想象中那么难。下面我们可以在HelloWorldQuery类的构造函数中再添加一个字段howdy, 并指定这个字段会返回一个字符串universe

    Copy
    Field<StringGraphType>(
        name: "howdy",
        resolve: context => "universe"
    ); 

    然后我们继续修改Startup类中的Configure方法, 修改我们之前定义的query

    Copy
    var schema = new Schema { 
        Query = new HelloWorldQuery()
    };
    
    app.Run(async (context) =>
    {
        var result = await new DocumentExecuter()
            .ExecuteAsync(doc =>
            {
                doc.Schema = schema;
                doc.Query = @"
                    query {
                        hello
                        howdy
                    }
                ";
            }).ConfigureAwait(false);
    
        var json = new DocumentWriter(indent: true)
            .Write(result);
        await context.Response.WriteAsync(json);
    });

    重新启动项目后,结果如下

    Copy
    {
      "data": {
        "hello": "world",
        "howdy": "universe"
      }
    }

    总结#

    本篇我们只是接触了GraphQL的一些皮毛,你可能会对GraphQL声明式行为有很多问题,没有关系,后续博客中,我们慢慢解开GraphQL的面纱。下一篇我们将介绍如何创建一个中间件(Middleware)

    本篇源代码:https://github.com/lamondlu/GraphQL_Blogs

     
     
  • 相关阅读:
    Spring Boot发布2.6.2、2.5.8:升级log4j2到2.17.0
    如何优雅地读写HttpServletRequest和HttpServletResponse的请求体
    更快的Maven来了
    Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)
    NumPy学习笔记
    来自Java程序员的Python新手入门小结
    Java应用日志如何与Jaeger的trace关联
    Jaeger知识点补充
    分布式调用链跟踪工具Jaeger?两分钟极速体验
    Spring Cloud Gateway过滤器精确控制异常返回(实战,完全定制返回body)
  • 原文地址:https://www.cnblogs.com/lhxsoft/p/11903514.html
Copyright © 2020-2023  润新知