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的更多相关文章

  1. .NET Core开发日志——Entity Framework与PostgreSQL

    Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...

  2. .NET Core开发日志——RequestDelegate

    本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...

  3. 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 重点: 实现多级子目录的压缩, ...

  4. .NET Core开发日志——从搭建开发环境开始

    .NET Core自2016年推出1.0版本开始,到目前已是2.1版本,在其roadmap计划里明年更会推出3.0版本,发展不可不谓之迅捷.不少公司在经过一个谨慎的观望期后,也逐步开始将系统升级至最新 ...

  5. .NET Core开发日志——结构化日志

    在.NET生态圈中,最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net.而其后来者,莫过于NLog.Nlog与log4net相比,有一项较显著的优势,它支持结构化日志. 结 ...

  6. .NET Core开发日志——Edge.js

    最近在项目中遇到这样的需求:要将旧有系统的一部分业务逻辑集成到新的自动化流程工具中.这套正在开发的自动化工具使用的是C#语言,而旧有系统的业务逻辑则是使用AngularJS在前端构建而成.所以最初的考 ...

  7. .NET Core开发日志——Linux版本的SQL Server

    SQL Server 2017版本已经可以在Linux系统上安装,但我在尝试.NET Core跨平台开发的时候使用的是Mac系统,所以这里记录了在Mac上安装SQL Server的过程. 最新的SQL ...

  8. .NET Core开发日志——Model Binding

    ASP.NET Core MVC中所提供的Model Binding功能简单但实用,其主要目的是将请求中包含的数据映射到action的方法参数中.这样就避免了开发者像在Web Forms时代那样需要从 ...

  9. .NET Core开发日志——简述路由

    有过ASP.NET或其它现代Web框架开发经历的开发者对路由这一名字应该不陌生.如果要用一句话解释什么是路由,可以这样形容:通过对URL的解析,指定相应的处理程序. 回忆下在Web Forms应用程序 ...

随机推荐

  1. 找不多控件, or 控件为null

    组件化开发,命名要使用moudle区分, 同名,在最后合成的时候,会出现很多问题,

  2. scikit-learn 决策树 分类问题

    1.Demo from sklearn import tree import pydotplus import numpy as np #李航p59表数据 #年龄,有工作,有自己房子,信贷情况,类别 ...

  3. Python学习笔记-Linux下安装Python

    Linux系统CentOS 1.安装依赖组件 yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel s ...

  4. Django的邮件发送以及云服务器上遇到的问题

    邮件发送 首先我们的邮箱要开通smtp服务,然后就可以在settings中配置了 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBacken ...

  5. 解决 Composer-Setup.exe 安装过程中的报错

    问题 在 Windows 7 执行 Composer-Setup.exe 以安装 Composer 过程中 上图中点击[Next]时,出现如下报错信息 原因分析 由上述提示信息,可推测两方面原因: 1 ...

  6. Maven内置属性

    1.内置属性:如${project.basedir}表示项目根目录,${ project.version}表示项目版本 2.POM属性:用户可以引用pom文件中对应的值.如: ${project.bu ...

  7. mybatis 保存对象 参数类型

    简单介绍:保存单个对象 ,参数类型的设置,正常的话应该设置成对应的pojo,我想起了以前,不懂事时候的一个做法,其实那时候刚接触到mabatis,做新增的时候,直接就是把需要插入表中的值,放到map里 ...

  8. python之鼠标的操作

    鼠标操作的方法,封装在ActionChains类中 perform:执行ActionChains中的所有存储行为 context_click:右键单击 move_to_element:悬停 doubl ...

  9. [原创]基于Zynq Linux环境搭建(二)

    在此篇,我们编译UBOOT 解压: [#17#17:26:56 FPGADeveloper@ubuntu ~/Zybo_Demo]$tar zxvf *.tar.gz 在解压过程中出现下述问题 tar ...

  10. .net 本地日志的添加

    /// <summary> /// 写入日志到文本文件 /// </summary> /// <param name="userName">用户 ...