GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
——出自 https://graphql.cn
如果换个简单粗暴的说法就是:减少API中查询的代码。这对写api的程序员是个福音,那这时你肯定想,减少后,那功能会减少吗?其实正好相反,会增加查询场景。
关于GraphQL的基础知识,可以通过https://grapql.cn来学习,这里不再赘述,当了解GraphQL基础知识后,这里要说明的是由Michael Staib主导的asp.net core上的GraphQL的实现。
首先安装两个Nuget包
HotChocolate.AspNetCore
HotChocolate.Data
在startup中注入graphql相关的实体类型
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; namespace GraphQLDemo00 { public class Startup { public void ConfigureServices(IServiceCollection services) { services .AddGraphQLServer()//引入GraphQL .AddQueryType<Query>()//注入查询类型 .AddProjections()//映射字段 .AddFiltering()//注入查询过滤器 .AddSorting();//注入排序 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapGraphQL(); }); } } }
定义查询
using HotChocolate.Data; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace GraphQLDemo00 { /// <summary> /// 查询类 /// </summary> public class Query { /// <summary> /// 查询学生 /// </summary> /// <returns></returns> [UseFiltering] [UseSorting] [UseProjection] public List<Student> GetStudents() { return new List<Student> { new Student { StuNo="N0001", Name="张三", Age=21, Sex=true }, new Student { StuNo="N0002", Name="李四", Age=22, Sex=false }, new Student { StuNo="N0003", Name="王五", Age=23, Sex=true } }; } } /// <summary> /// 学生实体 /// </summary> public class Student { /// <summary> /// 学号 /// </summary> public string StuNo { get; set; } /// <summary> /// 姓名 /// </summary> public string Name { get; set; } /// <summary> /// 年龄 /// </summary> public int Age { get; set; } /// <summary> /// 性别 /// </summary> public bool Sex { get; set; } } }
然后用http://localhost:5000/graphql,HotChocolate实现了一套UI
也可以用Postman来访问(可见GraphQL正在流行起来)
{ students(where:{ and:[{sex:{eq:true}}{age:{gt:21 }}]}){ stuNo name sex age } }
GraphQL正是通过上面的语法来实现自定义查询,条件可以*组合,返回的结果当然也是根据条件而来的,就像我们写SQL语句,select什么字段,where条件是什么,提升了灵活性,而不用每种查询我们都在后台代码中实现一下,这也正是它的重点。
想要更快更方便的了解相关知识,可以关注微信公众号