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

    store.js import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const store = new Vuex.Store({ ...

  2. 爬虫时遇到的' 编码错误gbk ' 的解决方案

    # 每次请求一次,然后写文件,这样可以规避多次请求触发反爬虫 r = requests.get('https://www.pearvideo.com/video_1522192') html = r. ...

  3. 【原创】大叔经验分享(28)ELK分析nginx日志

    提前安装好elk(elasticsearch.logstach.kibana) 一 启动logstash $LOGSTASH_HOME默认位于/usr/share/logstash或/opt/logs ...

  4. cf1154G 埃氏筛应用

    直接用埃氏筛也可以做,但是这题写起来有点恶臭.. 更加简单的写法是直接枚举gcd=k,然后里面再枚举一次i*k,即找到k两个最小的倍数,看起来复杂度很高,但其实也是埃氏筛的复杂度 因为每次枚举gcd, ...

  5. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

  6. python第九天(9-33)

    一:进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程 进程一般由程序,数据集,进程控制块组成 进程控制块: 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它 ...

  7. 一起学爬虫——urllib库常用方法用法总结

    1.读取cookies import http.cookiejar as cj,urllib.request as request cookie = cj.CookieJar() handler = ...

  8. Python学习(四十一)—— Djago进阶

    一.分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views ...

  9. Eclipse导入maven项目时,pom-xml文件报错处理方法

    报错如下: Cannot read lifecycle mapping metadata for artifact org.apache.maven.plugins 解决方法: 出现该错误是因为jar ...

  10. ISP PIPLINE (附加1) Green Imbalance

    1.什么是Green imbalance 芯片的Gr和Gb通道获取的能量或者是输出的数据不一致,造成这种情况的原因一方面是Gr,Gb通道的半导体制造工艺方面的差异,另一方面是microlens的存在, ...