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 }}]}){stuNonamesexage}
}
GraphQL正是通过上面的语法来实现自定义查询,条件可以自由组合,返回的结果当然也是根据条件而来的,就像我们写SQL语句,select什么字段,where条件是什么,提升了灵活性,而不用每种查询我们都在后台代码中实现一下,这也正是它的重点。