.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。

.NET Core开发日志——GraphQL的更多相关文章
- .NET Core开发日志——Entity Framework与PostgreSQL
Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...
- .NET Core开发日志——RequestDelegate
本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...
- .NET Core开发日志——从搭建开发环境开始
.NET Core自2016年推出1.0版本开始,到目前已是2.1版本,在其roadmap计划里明年更会推出3.0版本,发展不可不谓之迅捷.不少公司在经过一个谨慎的观望期后,也逐步开始将系统升级至最新 ...
- .NET Core开发日志——结构化日志
在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...
- .NET Core开发日志——Edge.js
最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中.这套正在开发的自动化工具使用的是C#语言,而旧有系统的业务逻辑则是使用AngularJS在前端构建而成.所以最初的考 ...
- .NET Core开发日志——Linux版本的SQL Server
SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...
- .NET Core开发日志——Model Binding
ASP.NET Core MVC中所提供的Model Binding功能简单但实用,其主要目的是将请求中包含的数据映射到action的方法参数中.这样就避免了开发者像在Web Forms时代那样需要从 ...
- .NET Core开发日志——简述路由
有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生.如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序. 回忆下在Web Forms应用程序 ...
随机推荐
- 找不多控件, or 控件为null
组件化开发,命名要使用moudle区分, 同名,在最后合成的时候,会出现很多问题,
- scikit-learn 决策树 分类问题
1.Demo from sklearn import tree import pydotplus import numpy as np #李航p59表数据 #年龄,有工作,有自己房子,信贷情况,类别 ...
- Python学习笔记-Linux下安装Python
Linux系统CentOS 1.安装依赖组件 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel s ...
- Django的邮件发送以及云服务器上遇到的问题
邮件发送 首先我们的邮箱要开通smtp服务,然后就可以在settings中配置了 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBacken ...
- 解决 Composer-Setup.exe 安装过程中的报错
问题 在 Windows 7 执行 Composer-Setup.exe 以安装 Composer 过程中 上图中点击[Next]时,出现如下报错信息 原因分析 由上述提示信息,可推测两方面原因: 1 ...
- Maven内置属性
1.内置属性:如${project.basedir}表示项目根目录,${ project.version}表示项目版本 2.POM属性:用户可以引用pom文件中对应的值.如: ${project.bu ...
- mybatis 保存对象 参数类型
简单介绍:保存单个对象 ,参数类型的设置,正常的话应该设置成对应的pojo,我想起了以前,不懂事时候的一个做法,其实那时候刚接触到mabatis,做新增的时候,直接就是把需要插入表中的值,放到map里 ...
- python之鼠标的操作
鼠标操作的方法,封装在ActionChains类中 perform:执行ActionChains中的所有存储行为 context_click:右键单击 move_to_element:悬停 doubl ...
- [原创]基于Zynq Linux环境搭建(二)
在此篇,我们编译UBOOT 解压: [#17#17:26:56 FPGADeveloper@ubuntu ~/Zybo_Demo]$tar zxvf *.tar.gz 在解压过程中出现下述问题 tar ...
- .net 本地日志的添加
/// <summary> /// 写入日志到文本文件 /// </summary> /// <param name="userName">用户 ...