ASP.NET Core中使用GraphQL - 第一章 Hello World

前言
你是否已经厌倦了REST风格的API? 让我们来聊一下GraphQL。 GraphQL提供了一种声明式的方式从服务器拉取数据。你可以从GraphQL官网中了解到GraphQL的所有优点。在这一系列博客中,我将展示如何在ASP.NET Core中集成GraphQL, 并使用GraphQL作为你的API查询语言。
使用GraphQL的声明式查询,你可以自定义API返回的属性列表。这与REST API中每个API只返回固定字段不同。
安装GraphQL
为了在C#中使用GraphQL, GraphQL社区中提供了一个开源组件graphql-dotnet。本系列博客中我们都将使用这个组件。
首先我们创建一个空的ASP.NET Core App
dotnet new web --name chatper1
然后我们添加对graphql-dotnet库的引用
dotnet add package GraphQL
创建第一个Query
下面我们来创建一个query类, 我们将它命名为HelloWorldQuery。graphql-dotnet中,查询类都需要继承ObjectGraphType类,所以HelloWorldQuery的代码如下
using GraphQL.Types;
public class HelloWorldQuery : ObjectGraphType
{
public HelloWorldQuery()
{
Field<StringGraphType>(
name: "hello",
resolve: context => "world"
);
}
}
这里你可能注意到我们使用了一个泛型方法Field,并传递了一个GraphQL的字符串类型StringGraphType来定义了一个hello字段, resolve 参数是一个Func委托,在其中定义了如何返回当前字段的值,这里我们是直接返回了一个字符串hello。
查询类中的返回字段都是定义在查询类的构造函数中的
现在我们一个有了一个查询类,下一步我们需要使用这个查询类构建一个结构(schema)。
在Startup.cs文件的Configure方法中,使用以下代码替换原有代码
var schema = new Schema {
Query = new HelloWorldQuery()
};
app.Run(async (context) =>
{
var result = await new DocumentExecuter()
.ExecuteAsync(doc =>
{
doc.Schema = schema;
doc.Query = @"
query {
hello
}
";
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true)
.Write(result)
await context.Response.WriteAsync(json);
});
DocumentExecuter类的ExecuteAsync方法中我们定义Action委托,并通过这个委托设置了一个ExecutionOptions对象。这个对象初始化了我们定义的结构(schema), 并执行了我们定义的查询字符串。doc.Query定义了一个查询字符串- 最终查询执行的结果会通过
DocumentWriter类实例的Write被转换成一个JSON字符串
下面我们来运行一下这个程序
dotnet run
你将在浏览器中看到以下结果
{
"data": {
"hello": "world"
}
}
从以上的例子中,你会发现使用GraphQL并不像想象中那么难。下面我们可以在HelloWorldQuery类的构造函数中再添加一个字段howdy, 并指定这个字段会返回一个字符串universe。
Field<StringGraphType>(
name: "howdy",
resolve: context => "universe"
);
然后我们继续修改Startup类中的Configure方法, 修改我们之前定义的query
var schema = new Schema {
Query = new HelloWorldQuery()
};
app.Run(async (context) =>
{
var result = await new DocumentExecuter()
.ExecuteAsync(doc =>
{
doc.Schema = schema;
doc.Query = @"
query {
hello
howdy
}
";
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true)
.Write(result);
await context.Response.WriteAsync(json);
});
重新启动项目后,结果如下
{
"data": {
"hello": "world",
"howdy": "universe"
}
}
总结
本篇我们只是接触了GraphQL的一些皮毛,你可能会对GraphQL声明式行为有很多问题,没有关系,后续博客中,我们慢慢解开GraphQL的面纱。下一篇我们将介绍如何创建一个中间件(Middleware)
本篇源代码:https://github.com/lamondlu/GraphQL_Blogs
ASP.NET Core中使用GraphQL - 第一章 Hello World的更多相关文章
- ASP.NET Core中使用GraphQL - 第二章 中间件
前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中间件 如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件, app ...
- ASP.NET Core中使用GraphQL - 第九章 在GraphQL中处理多对多关系
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- ASP.NET Core 中文文档 第一章 入门
原文:Getting Started 翻译:娄宇(Lyrics) 校对:刘怡(AlexLEWIS) 1.安装 .NET Core 2.创建一个新的 .NET Core 项目: mkdir aspnet ...
- ASP.NET Core中使用GraphQL - 第三章 依赖注入
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOL ...
- ASP.NET Core中使用GraphQL - 第四章 GraphiQL
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储
ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP ...
- ASP.NET Core中使用GraphQL - 第七章 Mutation
ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...
- ASP.NET Core中使用GraphQL - 最终章 Data Loader
ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间 ...
随机推荐
- Swift 结构体的使用
Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实 ...
- bzoj 1901 主席树+树状数组
修改+查询第k小值 单纯主席树修改会打乱所有,所以再套一个树状数组维护前缀和使得修改,查询都是log 对了,bzoj上不需要读入组数,蜜汁re.. #include<cstdio> #in ...
- laravel 中路由的快速设置(只需一个控制器名就ok) 不用具体到方法
routes/web.php 设置路由 Route::group(['middleware' => ['\iqiyi\Http\Middleware\VerifyCsrfToken::class ...
- 显著性检测(saliency detection)评价指标之KL散度距离Matlab代码实现
步骤1:先定义KLdiv函数: function score = KLdiv(saliencyMap, fixationMap) % saliencyMap is the saliency map % ...
- js十大排序算法
排序算法说明: (1)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排 ...
- Spark学习之数据读取与保存总结(二)
8.Hadoop输入输出格式 除了 Spark 封装的格式之外,也可以与任何 Hadoop 支持的格式交互.Spark 支持新旧两套Hadoop 文件 API,提供了很大的灵活性. 要使用新版的 Ha ...
- 【JVM虚拟机】(7)---深入理解Class中-属性集合
#[JVM虚拟机](7)---深入理解Class中-属性集合 之前有关class文件已经写了两篇博客: 1.[JVM虚拟机](5)---深入理解JVM-Class中常量池 2.[JVM虚拟机](6)- ...
- Springcloud Gateway 路由管理
Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开 ...
- 【开发记录】如何在B/S项目中使用中国天气的实时天气功能
好久没有更新我的博客了,正好手头有一个比较合适的项目经验可以分享出来,就是这个如何使用中国天气的天气预报功能,也正好做个项目经验记录. 功能需求 这个功能需求比较简单,就是想在网页端显示实时天气数据. ...
- go.js remove 特定part
我想删除一个实际上是背景的部分. 假设这是我添加part的方式 myDiagram.add( scope.gj(go.Part,//此Part未绑定到任何模型数据 { layerName:“Backg ...