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 应用是有用的,因为在下一章,我们将开始构建中间件;我们不会有任何一行不理解的代码。

参考资料:

GraphQL Part I: hello, world.的更多相关文章

  1. Facebook的Web开发三板斧:React.js、Relay和GraphQL

    2015-02-26 孙镜涛  InfoQ Eric Florenzano最近在自己的博客上发表了一篇题为<Facebook教我们如何构建网站>的文章,他认为软件开发有些时候需要比较大的跨 ...

  2. facebook graphql

    思想先进,前端直接从后台调用所需要的数据. 最简单的理解: 从"select * from 学生表" 进化为"select name, sex from 学生表" ...

  3. Graphql介绍(Introduction to GraphQL)

    Introduction to GraphQL  GraphQL介绍 Learn about GraphQL, how it works, and how to use it in this seri ...

  4. graphql 新API 开发方式

    我们知道 GraphQL 使用 Schema 来描述数据,并通过制定和实现 GraphQL 规范 定义了支持 Schema 查询的 DSQL (Domain Specific Query Langua ...

  5. [GraphQL] Use GraphQLNonNull for Required Fields

    While certain fields in a GraphQL Schema can be optional, there are some fields or arguments that ar ...

  6. [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 ...

  7. [GraphQL] Write a GraphQL Schema in JavaScript

    Writing out a GraphQL Schema in the common GraphQL Language can work for simple GraphQL Schemas, but ...

  8. [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 ...

  9. [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, ...

  10. [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 ...

随机推荐

  1. T2回家(home)题解

    T2回家(home) 现在啥也不是了,虽然会了逆元,但是对期望概率题还是一窍不通,赛时相当于只推出了 \(n=1\) 的情况,结果运用到所有情况,理所应当只有20分. 题目描述 小Z是个路痴.有一天小 ...

  2. Python 潮流周刊#71:PyPI 应该摆脱掉它的赞助依赖(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. C#获取环境变量的值

    Environment.GetEnvironmentVariable("Path"); 修改环境变量之后,不能立即生效,需要重启一下VStudio 或重启电脑 : 在 vstudi ...

  4. FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势

    ​喊了多年的互联网寒冬,今年的寒风格外凛冽,还在坚守安卓开发的朋友着实不容易.因为能转行的早就转了,能转岗的也早就转了,那么安卓程序员比较迷茫的就是,我该学什么安卓技术才好呢?还是直接扔了安卓再去搞别 ...

  5. AI实战篇:Spring AI + 混元 手把手带你实现企业级稳定可部署的AI业务智能体

    前言 在之前的内容中,我们详细讲解了Spring AI的基础用法及其底层原理.如果还有小伙伴对此感到困惑,欢迎参考下面这篇文章,深入学习并进一步掌握相关知识:https://www.cnblogs.c ...

  6. MiGPT让你的小爱音响更聪明

    大家好,我是晓凡. 今天要给大家带来一个超级有趣的开源项目MiGPT. 这个项目,简直就是给小爱音箱装上了超级大脑,让你的小爱音箱更聪明. 想象一下,当小爱音箱接入大模型后,上知天文,下知地理,从&q ...

  7. 这些HTTP协议状态码你知道吗?

    使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 1x ...

  8. Selenium操作:测试form表单

    from表单是经常测试的用例,用户登录.注册等都会用到form表单,本文简单设计了一个用户登录的form表单,并对该form表单进行测试 一.自定义form表单 1.用到的组件 如下图,图中定义了一个 ...

  9. Power BI 网关无法添加My SQL数据集

    今天第一次发布数据类型为MySQL的数据集到Power BI报表服务器,desktop的连接正常,但是发布到web端后,添加网关时却提示以下错误,如下图所示: 错误信息: 无法创建连接,原因如下: 无 ...

  10. 『玩转Streamlit』--文本与标题组件

    本篇准备开始介绍Streamlit的组件. Streamlit的组件非常多,后续几篇打算按照用途的分类,介绍每个分类中最常用的组件. 本次从最简单的组件开始,介绍文本和标题相关的组件,也就是以下4个组 ...