ASP.NET Core中使用GraphQL - 第二章 中间件

中间件#

如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件,

Copy

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);
});

这个中间件负责输出了当前查询的结果。

中间件的定义:

中间件是装载在应用程序管道中的组件,负责处理请求和响应,每一个中间件

  • 可以选择是否传递请求到应用程序管道中的下一个组件
  • 可以在应用程序管道中下一个组件运行前和运行后进行一些操作

来源: Microsoft Documentation

实际上中间件是一个委托,或者更精确的说是一个请求委托(Request Delegate)。 正如他的名字一样,中间件会处理请求,并决定是否将他委托到应用程序管道中的下一个中间件中。在我们前面的例子中,我们使用IApplicationBuilder类的Run()方法配置了一个请求委托。

使用动态查询体替换硬编码查询体#

在我们之前的例子中,中间件中的代码非常简单,它仅是返回了一个固定查询的结果。然而在现实场景中,查询应该是动态的,因此我们必须从请求中读取查询体。

在服务器端,每一个请求委托都可以接受一个HttpContext参数。如果一个查询体是通过POST请求发送到服务器的,你可以很容易的使用如下代码获取到请求体中的内容。

Copy

string body;
using (var streamReader = new StreamReader(httpContext.Request.Body))
{
    body = await streamReader.ReadToEndAsync();
}

在获取请求体内容之前,为了不引起任何问题,我们需要先检测一些当前请求

  • 是否是一个POST请求
  • 是否使用了特定的Url, 例如 /api/graphql

因此我们需要对代码进行调整。

Copy

if(context.Request.Path.StartsWithSegments("/api/graphql")
   && string.Equals(context.Request.Method,
                    "POST",
                    StringComparison.OrdinalIgnoreCase))
{
    string body;
    using (var streamReader = new StreamReader(context.Request.Body))
    {
        body = await streamReader.ReadToEndAsync();
    }

....
....
....

一个请求体可以包含很多字段,这里我们约定传入graphql查询体字段名称是query。因此我们可以将请求体中的JSON字符串转换成一个包含Query属性的复杂类型。

这个复杂类型代码如下:

Copy

public class GraphQLRequest
{
    public string Query { get; set; }
}

下一步我们要做的就是,反序列化当前请求体的内容为一个GraphQLRequest类型的实例。这里我们需要使用Json.Net中的静态方法JsonConvert.DeserializeObjct来替换之前的硬编码的查询体。

Copy

var request = JsonConvert.DeserializeObject<GraphQLRequest>(body);

var result = await new DocumentExecuter().ExecuteAsync(doc =>
{
    doc.Schema = schema;
    doc.Query = request.Query;
}).ConfigureAwait(false);

在完成以上修改之后,Startup.cs文件的Run方法应该是这个样子的。

Copy

app.Run(async (context) =>
{
    if (context.Request.Path.StartsWithSegments("/api/graphql")
        && string.Equals(context.Request.Method,
                         "POST",
                         StringComparison.OrdinalIgnoreCase))
    {
        string body;
        using (var streamReader = new StreamReader(context.Request.Body))
        {
            body = await streamReader.ReadToEndAsync();

            var request = JsonConvert.DeserializeObject<GraphQLRequest>(body);
            var schema = new Schema { Query = new HelloWorldQuery() };

            var result = await new DocumentExecuter()
                .ExecuteAsync(doc =>
            {
                doc.Schema = schema;
                doc.Query = request.Query;
            }).ConfigureAwait(false);

            var json = new DocumentWriter(indent: true)
                .Write(result);
            await context.Response.WriteAsync(json);
        }
    }
});

最终效果#

现在我们可以使用POSTMAN来创建一个POST请求, 请求结果如下:

结果正确返回了。

本篇源代码: https://github.com/lamondlu/GraphQL_Blogs/tree/master/Part%20II

原文地址:https://www.cnblogs.com/lhxsoft/p/11903527.html

时间: 2024-11-09 06:34:42

ASP.NET Core中使用GraphQL - 第二章 中间件的相关文章

ASP.NET Core 中文文档 第二章 指南(3)用 Visual Studio 发布一个 Azure

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 原文:Getting Started 作者:Rick Anderson 翻译:谢炀(Kiler) 校对:孟帅洋(书缘).刘怡(AlexLEWIS).何镇汐 设置开发环境 安装最新版本的 Azure SDK for Visual Studio 2

ASP.NET Core 中文文档 第二章 指南(4.1)ASP.NET Core MVC 与 Visua

参考页面: http://www.yuanjiaocheng.net/ASPNET-CORE/projectjson.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-configuration.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-middleware.html http://www.yuanjiaocheng.net/ASPNET-CORE/core-exception.htm

ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) ApplicationDbContext 类负责连接数据库并将 Movie 对象和数据记录进行映射. Startup.cs 文件中,数据库上下文是在 ConfigureServices 方法中用 Dependency Injection 容器进行注册的. // This method gets called

ASP.NET Core 中文文档 第二章 指南(4.10)检查自动生成的Detail方法和Delete方

原文 Examining the Details and Delete methods 作者 Rick Anderson 翻译 谢炀(Kiler) 校对 许登洋(Seay).姚阿勇(Mr.Yao) 打开 Movie 控制器并查看 Details 方法: // GET: Movies/Details/5 public async Task<IActionResult> Details(int? id) { if (id == null) { return NotFound(); } var mo

ASP.NET Core 中文文档 第二章 指南(4.3)添加 View

原文:Adding a view 作者:Rick Anderson 翻译:魏美娟(初见) 校对:赵亮(悲梦).高嵩(Jack).娄宇(Lyrics).许登洋(Seay).姚阿勇(Dr.Yao) 本节将修改 HelloWorldController 类,把使用 Razor 视图模板文件为客户端生成 HTML 响应的过程干净利落地封装起来. 您可以使用 Razor 视图引擎创建一个视图模板.基于 Razor 的视图模板的文件使用 .cshtml 作为其扩展名,并用 C# 优雅地输出 HTML.用 R

ASP.NET Core中使用GraphQL - 第六章 使用EF Core作为持久化仓储

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP.NET Core中使用GraphQL - 第三章 依赖注入 ASP.NET Core中使用GraphQL - 第四章 GrahpiQL ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量 本篇中我将演示如何配置持久化仓储,这里原文中是使用的Postgres, 这里我改用

ASP.NET Core中使用GraphQL - 第三章 依赖注入

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 SOLID原则中的D表示依赖倒置原则.这个原则的内容是: 上层模块不应该直接依赖底层模块,而应该依赖其抽象 抽象不应该依赖于细节, 细节应该依赖抽象 来源:WIKIPEDIA 在一个模块中创建一个其他模块的实例会导致这个模块与其他模块之间的紧耦合. 为了让不同的模块解耦,我们需要遵循依赖倒置原则.按照这种

ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP.NET Core中使用GraphQL - 第三章 依赖注入 ASP.NET Core中使用GraphQL - 第四章 GrahpiQL 字段# 我们已经很好的理解了GraphQL中的字段.在之前HelloWorldQuery的例子中,我们添加了2个字段hello和howdy. 它们都是标量字段.正

ASP.NET Core中使用GraphQL - 第八章 在GraphQL中处理一对多关系

ASP.NET Core中使用GraphQL - 目录 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中间件 ASP.NET Core中使用GraphQL - 第三章 依赖注入 ASP.NET Core中使用GraphQL - 第四章 GrahpiQL ASP.NET Core中使用GraphQL - 第五章 字段, 参数, 变量 ASP.NET Core中使用GraphQL - 第六章 使用EF Co