GraphQL 简介
下面是 GraphQL 的定义:
GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述, 使得客户端能够准确地获得它需要的数据, 而且没有任何冗余, 也让 API 更容易地随着时间推移而演进, 还能用于构建强大的开发者工具.
GraphQL 由 Facebook 开发, 始于 2012 年, 2015 年公开.
GraphQL 牛逼之处是它可以让客户端精确的查询它们想要的, 不附加额外的东西, 这样的话就很容易让客户端随着 API 的演进去使用.
例子
下面是一个简单的例子, 这是一个 GraphQL 的查询:
- {
- person {
- name
- }
- }
而这个查询的响应结果是:
- {
- "data": {
- "person": {
- "name": "Dave",
- "email": "331335713@qq.com"
- }
- }
- }
可以看到响应结果和查询请求的内容结构几乎是完全一样的. 如果你需要 person 其它的信息, 例如 parents, 那么在查询中加上这个属性即可:
- {
- person {
- name
- parents {
- name
- }
- }
- }
它的响应会像这样:
- {
- "data": {
- "person": {
- "name": "Dave",
- "email": "331335713@qq.com",
- "parents": [
- {
- "name": "Nick"
- },
- {
- "name": "AJ"
- },
- {
- "name": "Brian"
- }
- ]
- }
- }
- }
在 ASP.NET Core 中支持 GraphQL
GraphQL 的查询通常会被发送到一个特定的 GraphQL 端点. 在这个端点, 会处理请求查询并返回 GraphQL 对象结果.
建立项目
下面我们就在 ASP.NET Core 中实现这个功能, 首先建立项目:
使用 dotnet cli 在命令行输入:
dotnet new web --name graph
这样会建立一个 ASP.NET Core 的空项目. 项目结构如图:
建立 Model
然后建立一个 Person 的 Model:
建立 Repository
下面建立用于查询 Person 的 Repository, 首先是接口:
然后是具体的 Repository, 里面带有一些写死的数据:
添加 GraphQL 库
通过 dotnet cli 添加 GraphQL 这个库:
dotnet add package GraphQL
安装成功后, 在项目文件里会有显示:
建立 GraphQL 中间件
首先我需要一个 GraphQL 特定的 Person 类型类, 它要包含映射到 Person 类的字段:
该类需要继承于 ObjectGraphType<Person>.
然后我还需要一个查询类, 它里面包含对 GraphQL 实现的细节:
该类需要继承于 ObjectGraphType. 在这里, 我把所有请求查询的字段映射到了 PersonRepository 的调用上.
最后是中间件:
该类的意思就是, 当请求地址是 "/graphql" 开头时, 就会尝试读取请求的 body. 然后建立一个 Schema 对象, 它的 query 字段的值就是 PersonQuery 的实例, 而 PersonQuery 的实例又需要 PersonRepository 作为参数.
最后建立一个 DocumentExecuter 来对这个 schema 进行查询, 结果以 JSON 格式返回.
注册 Repository, 使用中间件
别忘了在 Startup.cs 里注册 Repository 和在管道里调用我们的中间件:
测试
运行 ASP.NET Core 项目:
dotnet watch run
打开 POSTMAN, 首先按 id 查询一个 Person:
Cool, 没问题.
再来一个带 Parents 的查询:
最后再查询所有的 Person 吧:
注意这里的查询写的是 persons 而不是 person, 这个要和 PersonQuery 类里面的定义一致.
结语
这只不过是使用 ASP.NET Core 支持 GraphQL 的一个原始手动实现而已.
.NET Core 有很多支持 GraphQL 的很方便库, 例如 graphql-dotnet: https://GitHub.com/graphql-dotnet/graphql-dotnet .
实际项目中还是需要使用这些库的.
来源: https://www.cnblogs.com/cgzl/p/9691323.html