• 【GraphQL】使用Hot Chocolate和.NET 6构建GraphQL应用


    What?

    GraphQL 是一种类似于 SQL 的结构化查询语言,由 facebook 于2012年创造,于2015年开源。SQL 在服务端定义,GraphQL 在客户端定义,也就是说 GraphQL 将数据的操作控制权从后端转移到了前端。

    Why?

    传统的 Restful API 存在的主要问题是无法灵活、精准的匹配前端的数据需求。

    首先,产品的需求经常变,于是前端需要的接口也经常变,比如遇到版本迭代,即便整个数据库结构没有任何变化,常常也需要重写或新增很多接口。其次,前端存在不同的平台,可能对同一类数据的请求,web 端和 app 端需要的字段是不一样的。

    后端的接口要做到与前端的需求一一匹配,会极大的增加后端的工作量,于是后端可能会采取这样的方式:“为多个请求提供一个接口并集,而不是分别为每个请求单独提供接口”,“有现成可用,就尽量不新增接口”,比如前端需要两个接口 {1, 2}、{1, 3, 4},后端只需提供一个接口 {1, 2, 3, 4}。

    于是前端对数据的需求和后端提供的接口常常无法精准匹配。前端总会遇到这样的情况:请求的接口常常返回很多冗余数据;为了拿到一组数据,不得不发送多个请求;请求到的数据不符合需要的格式,不得不做额外处理;有时某个接口就只少了一个字段……

    一方面冗余的数据和多次的请求必然会影响产品体验,另一方面围绕 Restful API 建立的前后端协作模式会导致大量沟通成本,需要约定、需要接口文档、甚至还需要“联调”。

    解决问题的办法可以是“深入推进前后端技术融合、全面加强前后端协作沟通、狠抓落实文档规范……”,这些都是办法,但对于 facebook 这种体量的产品,靠人力解决上述问题的成本可能是我们无法想象的,而且这也不像是技术人员解决问题的方式,至少 facebook 的工程师不这么想。

    近年来 web 开发的基本趋势是从后向前移,越来越多的逻辑在前端处理,但是接口仍然需要后端提供,前端总是要等后端喂接口,后端写的接口总是要等前端来验证,那么为什么 SQL 不能让前端来写呢?这就是 GraphQL 提出的解决方案:由前端来定义所需数据、发送查询命令,服务器根据请求自动查询数据库并按指定的数据结构返回数据,用啥取啥,后端只提供服务,而不再关心具体的业务。

    自动化实现,应该永远是每个程序员解决问题的第一思路。

    How?

    在这里插入图片描述
    前端向服务端发送的 GraphQL 就是一串字符串,它的结构和 json 类似,其中包含增、删、改、查的指令,括号中定义了一些参数。服务端收到请求就会根据指定的指令、字段和参数返回所需的结构化数据。简单的说,就是前端发送只有属性名,而没有值的 json,服务端返回填充了值的 json。
    在这里插入图片描述

    Pros?

    1、网络层数据无冗余。特别是在移动端,冗余数据可能带来不小的延迟;

    2、前后端沟通成本低。根本用不着联调,后端也用不着写什么接口文档;

    3、灵活应对各种变化。前端取数据跟吃自助餐似的,私人订制,予取予求;

    Cons?

    既然这么牛,怎么似乎没啥人用呢?

    以下参考尤雨溪的回答:https://www.zhihu.com/question/38596306?sort=created

    1、服务端结构必须符合 GraphQL spec 的规范,这意味着后端需要重写;

    2、GraphQL 非常适合特定的前端框架如 React,对于不使用前端框架的公司,就比较尴尬了;

    3、数据库查询这一层的性能优化比较难做,对于 facebook 这不是问题,对于其它公司可能就是个问题;

    4、GraphQL 需要后端配合,然而由于路径依赖、风险厌恶等可能的因素,前端要推动 GraphQL 必然会遇到各种阻力。

    Hot Chocolate

    Hot Chocolate是.NET平台下的开源GraphQL服务器,符合最新的GraphQL 2021草案规范。

    Hot Chocolate消除了构建成熟的GraphQL服务器的复杂性,可以让我们轻松实现ASP.NET Core GraphQL服务器。

    Demo

    引用Nuget包

    创建ASP.NET Core Web API项目,安装如下Nuget包:

    HotChocolate.AspNetCore
    
    • 1

    创建模型

    假设,我们要查询用户相关数据。

    新增User.cs文件,代码如下:

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建Query类

    新增Query.cs文件,这个类将包含我们需要执行的所有查询,代码如下:

    public class Query
    {
        public async Task<User> GetUser(int id)
        {
            return new User { Id = id, Name = "Name_"+id, Age = new Random().Next(20,30) };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里我用的假数据,你也可以改成使用数据库。

    配置GraphQL

    我们需要配置应用程序以使用GraphQL。修改Startup.cs中的代码如下:

    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services
            .AddGraphQLServer()
            .AddQueryType<Query>();
    }
     
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        ...
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGraphQL();
            endpoints.MapControllers();
        });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行GraphQL

    运行应用程序,访问https://启动地址/graphql/,你应该可以打开Hot Chocolate内置的GraphQL IDE(Banana Cake Pop)。

    我们可以通过输入GraphQL查询语句,并点击Execute按钮来获取我们想要的数据:
    在这里插入图片描述

    来源

    GraphQL 简介
    使用Hot Chocolate创建ASP.NET Core GraphQL服务

  • 相关阅读:
    CMMI认证多少钱?
    day33 文件上传&中间件解析漏洞&编辑器安全
    瀑布流使用虚拟列表性能优化
    Google Earth Engine(GEE)——ImageCollection (Error)遍历影像集合产生的错误
    Mac用命令行安装Adobe代码字体Source Code Pro
    ajax和web前端:深入解析其重要性、应用、挑战与未来趋势
    cmd命令行,杀掉某个进程,以(Anaconda为例)
    UR机器人RTDE(Real-Time Data Exchange,实时数据交换)
    多商户进驻小程序商城的作用是什么
    java设计模式(七)适配器模式(Adapter Pattern)
  • 原文地址:https://blog.csdn.net/weixin_44231544/article/details/126126628