GraphQL Part I: hello, world.
GraphQL with ASP.NET Core (Part- I : Hello World)
厌倦了 REST? 让我们谈一下 GraphQL, GraphQL 提供声明式的方式从服务器获取数据。您可以从 GraphQL 的官方站点看到所有的优点。当前,在这个博客系列中,我将使用 ASP.NET Core 来展现如何集成 GraphQL ,将它实现为 API 的查询语言。
这意味着您只需要声明您所需要的属性,相对与 REST,对于特定的端点返回固定的数据集,然后您需要找到需要的属性。
对于 C# 来说,社区已经提供了一个开源的 graphql-dotnet,我们将使用它来完成项目。让我们开始吧。
首先从创建一个 ASP.NET Core 应用开始
dotnet new web
我们将会构建一个 GraphQL 的中间件(在下一篇文章),但是,第一步,让我们先从基础开始,假设您已经对 GraphQL 有了一点了解。所以,考虑一个简单的 Hello World 应用:我们将从服务器查询 hello 属性,然后服务器将返回 "world" 字符串,所以,这个 hello 属性一定是字符串类型。
在我们的空项目中,添加 GraphQL package for dotnet,然后,获取这个包。
dotnet add package GraphQL --version 2.0.0-alpha-912
dotnet restore
该系列的文章将会使用包的最新更新。如果我忘了更新文章,使得示例不能工作,请留言告诉我需要更新了。
让我们创建一个 query 并命名为 HelloWorldQuery。它是一个简单的类用于定义查询的字段。任何 query 类应该从 ObjectGraphType 派生出来。所以,HelloWorldQuery 类应该包含一个字符串的字段,如下所示:
using GraphQL.Types;
public class HelloWorldQuery : ObjectGraphType
{
public HelloWorldQuery()
{
Field<StringGraphType>(
name: "hello",
resolve: context => "world"
);
}
}
字段定义在构造函数中
注意,我们使用泛型版本的 Field 并传递了一个 GraphQL 字符串类型(StringGraphType)来使得查询知道 hello 字段包含字符串类型的返回结果。
现在我们拥有了一个查询,然后我们需要为它构建一个 schema。
在 Startup.cs 文件的 Configure 方法中,删除现存的代码并粘贴如下代码。
var schema = new Schema { Query = new HelloWorldQuery() };
app.Run(async (context) =>
{
var result = await new DocumentExecuter().ExecuteAsync(options =>
{
options.Schema = schema;
options.Query = @"
query {
hello
}
";
}).ConfigureAwait(false);
var json = new DocumentWriter(indent: true).Write(result)
await context.Response.WriteAsync(json);
});
请注意,我们通过 HelloWorldQuery 对象的实例创建了一个新的 GraphQL schema。
DocumentExecuter 的 ExecuteAsync() 方法获取一个 ExecutionOptions 类型的 Action。这里初始化了 schema 并基于它执行提供的查询。
仔细查看赋予 Query (doc.Query) 的字符串。这里我们仅仅请求 hello 字段。您可以重写这个字符串为 {hello} ( 不需要 query 部分 ),它也同样工作。
最后,执行的结果被使用 DocumentWriter 类的 Write() 函数转换为 JSON。最终但不是最后我们将 JSON 输出到响应中。
现在,运行应用
dotnet run
您将会从浏览器获得以下输出。

您会发现它并不难。我们可以添加其他的字段,比如或 howdy ,然后让它返回字符串 universe。如下在 HelloWorldQuery 类中添加另外一个字段。
Field<StringGraphType>(
name: "howdy",
resolve: context => "universe"
);
现在,回到 Startup.cs,这次我们仅仅查询 howdy 在查询中 { howdy } 。您将收到如下的回应。

并且,您可以通过如下的 query 查询两个字段,如下所示:
{
hello
howdy
}
您将收到如下的响应:

所以,在这一步,您可以从声明的角度来查询您所感兴趣的部分。GraphQL 足够智能来理解您的需要并返回适当的响应。
我们仅仅草创了表面的东西。hello world 应用是有用的,因为在下一章,我们将开始构建中间件;我们不会有任何一行不理解的代码。
参考资料:
- C#: Why you should use ConfigureAwait(false) in your library code
- Getting Started with graphql-dotnet
- GraphQL Scaler Types
GraphQL Part I: hello, world.的更多相关文章
- Facebook的Web开发三板斧:React.js、Relay和GraphQL
2015-02-26 孙镜涛 InfoQ Eric Florenzano最近在自己的博客上发表了一篇题为<Facebook教我们如何构建网站>的文章,他认为软件开发有些时候需要比较大的跨 ...
- facebook graphql
思想先进,前端直接从后台调用所需要的数据. 最简单的理解: 从"select * from 学生表" 进化为"select name, sex from 学生表" ...
- Graphql介绍(Introduction to GraphQL)
Introduction to GraphQL GraphQL介绍 Learn about GraphQL, how it works, and how to use it in this seri ...
- graphql 新API 开发方式
我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范 定义了支持 Schema 查询的 DSQL (Domain Specific Query Langua ...
- [GraphQL] Use GraphQLNonNull for Required Fields
While certain fields in a GraphQL Schema can be optional, there are some fields or arguments that ar ...
- [GraphQL] Use Arguments in a GraphQL Query
In GraphQL, every field and nested object is able to take in arguments of varying types in order to ...
- [GraphQL] Write a GraphQL Schema in JavaScript
Writing out a GraphQL Schema in the common GraphQL Language can work for simple GraphQL Schemas, but ...
- [GraphQL] Serve a GraphQL Schema as Middleware in Express
If we have a GraphQL Schema expressed in terms of JavaScript, then we have a convenient package avai ...
- [GraphQL] Use GraphQL's List Type for Collections
In order to handle collections of items in a GraphQL Schema, GraphQL has a List Type. In this video, ...
- [GraphQL] Use GraphQL's Object Type for Basic Types
We can create the most basic components of our GraphQL Schema using GraphQL's Object Types. These ty ...
随机推荐
- 如何判断一个网站是用的Nginx,还是Apache
事件起因: 接手了同事移交过来的一个网站,但是不知道这个网站是用什么做代理的,于是就去网上查资料 解决办法: 打开cmd窗口,输入以下命令即可 curl --head 域名/IP 注意,--hea ...
- javaScript遍历对象总结
定义对象: const obj = { name: 'zlx', id: 245, age: 25, gender: '男', } 1. 使用 for... in..循环遍历 对象的属性有2种方式可以 ...
- 1. java + react 实现 HRM
1. 云服务的三种方式 1.1 IAAS 基础设施即服务 ,只会提供基础的设施,eg:服务器,网络等 : 1.2 PAAS 平台即服务 ,提供平台,可以把自己写好的代码部署到平台上 : 1.3 SAA ...
- 基于乐鑫 ESP32-C3 的 Matter Light 实践
背景介绍 最近公司在研究 Matter 协议在智能家居领域的市场机会,考虑到易用性和文档支撑等方面,相比较 Telink,产品部门对乐鑫的 Matter-SDK 更感兴趣,因而开展了一些测试工作,毕竟 ...
- c++时间管理大师
作者花了一个下午写出来的. c++写的时间管理大师. 支持一下. #include<bits/stdc++.h> #include<windows.h> using names ...
- 创建一个专属的 CLI
作为一个前端,基本上每次初始化项目都会用到脚手架,通过一些脚手架可以快速的搭建一个前端的项目并集成一些所需的功能模块,避免自己每次都手动一个一个去安装.安装各个包的这个过程其实没啥营养,通过封装一个脚 ...
- JS 通过后台接口返回的URL地址下载文件并保存到本地(已在项目中使用,保存音视频文件)
今天做antdV表格勾选下载操作时,因为粗心大意碰到了下载问题,特此记录~ 一.单个文件下载逻辑代码如下: const exportFile = (data, fileName, _this)=> ...
- 微信小程序、uniapp、vue生命周期钩子函数
生命周期是指从创建到销毁的过程 一.微信小程序 小程序里面有两种生命周期函数,第一个:通过App()来注册一个小程序 ,第二个:通过Page()来注册一个页面 应用生命周期函数 app( ) ap ...
- 关于如何更改Cuda的版本的一些事情
1. 网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片 ...
- Windows系统密钥(实测可用)
Windows Server 2003 R2 sp2 standard edition 文件名:cn_win_srv_2003_r2_standard_with_sp2_cd1_X13-13927.i ...