GraphQL:简单开开始一个查询
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条件是什么,提升了灵活性,而不用每种查询我们都在后台代码中实现一下,这也正是它的重点。
想要更快更方便的了解相关知识,可以关注微信公众号