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 ...
随机推荐
- T2回家(home)题解
T2回家(home) 现在啥也不是了,虽然会了逆元,但是对期望概率题还是一窍不通,赛时相当于只推出了 \(n=1\) 的情况,结果运用到所有情况,理所应当只有20分. 题目描述 小Z是个路痴.有一天小 ...
- Python 潮流周刊#71:PyPI 应该摆脱掉它的赞助依赖(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- C#获取环境变量的值
Environment.GetEnvironmentVariable("Path"); 修改环境变量之后,不能立即生效,需要重启一下VStudio 或重启电脑 : 在 vstudi ...
- FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
喊了多年的互联网寒冬,今年的寒风格外凛冽,还在坚守安卓开发的朋友着实不容易.因为能转行的早就转了,能转岗的也早就转了,那么安卓程序员比较迷茫的就是,我该学什么安卓技术才好呢?还是直接扔了安卓再去搞别 ...
- AI实战篇:Spring AI + 混元 手把手带你实现企业级稳定可部署的AI业务智能体
前言 在之前的内容中,我们详细讲解了Spring AI的基础用法及其底层原理.如果还有小伙伴对此感到困惑,欢迎参考下面这篇文章,深入学习并进一步掌握相关知识:https://www.cnblogs.c ...
- MiGPT让你的小爱音响更聪明
大家好,我是晓凡. 今天要给大家带来一个超级有趣的开源项目MiGPT. 这个项目,简直就是给小爱音箱装上了超级大脑,让你的小爱音箱更聪明. 想象一下,当小爱音箱接入大模型后,上知天文,下知地理,从&q ...
- 这些HTTP协议状态码你知道吗?
使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 1x ...
- Selenium操作:测试form表单
from表单是经常测试的用例,用户登录.注册等都会用到form表单,本文简单设计了一个用户登录的form表单,并对该form表单进行测试 一.自定义form表单 1.用到的组件 如下图,图中定义了一个 ...
- Power BI 网关无法添加My SQL数据集
今天第一次发布数据类型为MySQL的数据集到Power BI报表服务器,desktop的连接正常,但是发布到web端后,添加网关时却提示以下错误,如下图所示: 错误信息: 无法创建连接,原因如下: 无 ...
- 『玩转Streamlit』--文本与标题组件
本篇准备开始介绍Streamlit的组件. Streamlit的组件非常多,后续几篇打算按照用途的分类,介绍每个分类中最常用的组件. 本次从最简单的组件开始,介绍文本和标题相关的组件,也就是以下4个组 ...