zoukankan      html  css  js  c++  java
  • .NET Core开发日志——GraphQL

    GraphQL是什么

    GraphQL既是一种用于API的查询语言也是一种通过使用对应数据的类型系统,执行数据查询的服务端运行时。GraphQL没有局限于任何数据库或存储引擎,而是通过既有代码及数据获得支持。

    Schema

    GraphQL的Schema是GraphQL服务端实现的核心部分。它负责描述能够被客户端程序使用的功能。而在Schema中,类型系统又是其基石。包含了创建类型之间的联系,定义数据获取操作(查询)及数据处理操作(增删改),以及自我描述等特性。

    程序语言支持

    GraphQL服务端类库已经被多种程序语言支持。

    • C# / .NET
    • Clojure
    • Elixir
    • Erlang
    • Go
    • Groovy
    • Java
    • JavaScript
    • PHP
    • Python
    • Scala
    • Ruby

    Package

    要想在.NET Core中使用GraphQL,执行以下命令添加所需类库包。

    dotnet add package GraphQL
    

    ASP.NET Core

    在ASP.NET中使用GraphQL有两种方式。

    其一,是在传统的Controller里调用GraphQL的方法:

    [Route("api/[controller]")]
    [ApiController]
    public class GraphQLController : ControllerBase
    {
        [HttpPost]
        public async Task<IActionResult> Post([FromBody]GraphQLQuery query)
        {
            var schema = Schema.For(@"
                type Query {
                    user: Person
                }
                type Person {
                    id: String
                    name: String
                }
            ");
    
            var root = new { User = new { Id = "1", Name = "Ken" } };
    
            var result = await new DocumentExecuter().ExecuteAsync(_ =>
            {
                _.Schema = schema;
                _.Query = query.Query;
                _.Root = root;
            }).ConfigureAwait(false);
    
            return Ok(result);
        }
    }
    
    public class GraphQLQuery
    {
        public string OperationName { get; set; }
        public string NamedQuery { get; set; }
        public string Query { get; set; }
        public Inputs Variables { get; set; }
    }
    

    运行程序后,可用Postman作为客户端测试,并在请求内容中输入以下数据:

    {
        "query": "query { user { id name }}"
    }
    

    可得结果:

    {
        "data": {
            "user": {
                "id": "1",
                "name": "Ken"
            }
        }
    }
    

    其二是通过Middleware的方式。

    首先追加类库包GraphQL.Server.Transports.AspNetCore

    接着定义Schema类与ObjectGraphType(假设尚未创建):

    public class Person
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
    public class PersonType: ObjectGraphType<Person>
    {
        public PersonType()
        {
            Field(x => x.Id);
            Field(x => x.Name);
        }
    }
    
    public class UserQuery : ObjectGraphType
    {
        public UserQuery()
        {
            Field<PersonType>(name: "user", resolve: ctx=> new Person {  Id = "1", Name = "Ken" });
        }
    }
    
    public class UserSchema: Schema
    {
        public UserSchema()
        {
            Query = new UserQuery();
        }
    }
    

    然后在Startup文件里,添加GraphQL相关内容。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<UserSchema>();
        services.AddGraphQL(_ =>
        {
            _.EnableMetrics = true;
            _.ExposeExceptions = true;
        });
    }
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseGraphQL<UserSchema>("/graphql");
    }
    

    运行后,客户端调用方法与第一种方式相同。

    除了使用Postman作为客户端调用GraphQL之外,还可以尝试GraphQLPlayground获得更便捷的体验。

    安装相关类库包:dotnet add package GraphQL.Server.Ui.Playground

    在Configure方法里增加一行代码。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseGraphQL<UserSchema>("/graphql");
        app.UseGraphQLPlayground(new GraphQLPlaygroundOptions());
    }
    

    然后运行程序,访问http://url地址/ui/playground,即可直接在网页中调用GraphQL。

  • 相关阅读:
    深度学习之Python 脚本训练keras mnist 数字识别模型
    Hive udtf 报错 java.lang.String cannot be cast to java.lang.Integer
    vue 中 created 和 mounted 钩子生命周期 问题
    vue和 jsplumb 集成 出现下面的错误
    Cognos 中 javascript jQuery 的使用
    Hadoop 下常用的命令
    剑指offer30:连续子数组的最大和
    剑指offer29:最小的k个数
    剑指offer28:找出数组中超过一半的数字。
    剑指offer27:按字典序打印出该字符串中字符的所有排列
  • 原文地址:https://www.cnblogs.com/kenwoo/p/10779885.html
Copyright © 2011-2022 走看看