GraphQL:拼接Stitching

2023-11-06 03:08
文章标签 graphql 拼接 stitching

本文主要是介绍GraphQL:拼接Stitching,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。

                                   ——出自 https://graphql.cn

数据是有关系的,可以利用HotChocolate.Stitching功能,把业务逻辑相关联的实体数据,从后台的两个服务中关联起来,这有点api网关的组合功能,可以把前端的一次请求,分解成后端的多次请求,并把数据组合后返回回去。

下面有这样一个例子:有个学生服务,有两个api,一个是查询全部学生,一个是按学号查询学生;另一个是成绩服务,有两个api,一个是按学号查询这个学生的全部成绩,一个是按id查询成绩。现在可以在学生实体中组合成绩,也可以在成绩实体中组合学生,这是因为学生和成绩是一个一对多的关系。

下面来看实例:

学生服务:GraphQLDemo03_Students

引入NuGet

HotChocolate.AspNetCore

HotChocolate.Data

Starup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace GraphQLDemo03_Students
{public class Startup{     public void ConfigureServices(IServiceCollection services){services.AddSingleton<IStudentRepository, StudentRepository>().AddGraphQLServer().AddQueryType<Query>()             ;}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGraphQL();});}}
}

Query.cs

using HotChocolate;
using System.Collections.Generic;namespace GraphQLDemo03_Students
{public class Query{  public IEnumerable<Student> GetStudents([Service] IStudentRepository studentRepository){return studentRepository.GetStudents();}public Student GetStudent(string stuNo, [Service] IStudentRepository studentRepository){return studentRepository.GetStudent(stuNo);}}
}

StudentRepository.cs

using System.Collections.Generic;
using System.Linq;namespace GraphQLDemo03_Students
{public interface IStudentRepository{IEnumerable<Student> GetStudents();Student GetStudent(string stuNo);}public class StudentRepository : IStudentRepository{public IEnumerable<Student> GetStudents(){var students = new List<Student>() {new Student("S0001","小张",20,true),new Student("S0002","小李",19,false),};return students;}public Student GetStudent(string stuNo){var students = new List<Student>() {new Student("S0001","小张",20,true),new Student("S0002","小李",19,false),};return students.SingleOrDefault(s => s.StuNo == stuNo);}}public record Student(string StuNo, string Name, int Age, bool Sex);
}

成绩服务:GraphQLDemo03_Grades

引入NuGet包

HotChocolate.AspNetCore

HotChocolate.Data

Startup.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;namespace GraphQLDemo03_Grades
{public class Startup{public void ConfigureServices(IServiceCollection services){services.AddSingleton<IGradeRepository, GradeRepository>() .AddGraphQLServer()  .AddQueryType<Query>();}    public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGraphQL();});}}
}

Query.cs

using HotChocolate;
using System.Collections.Generic;namespace GraphQLDemo03_Grades
{  public class Query{public IEnumerable<Grade> GetGrades([Service] IGradeRepository gradeRepository, string stuNo){return gradeRepository.GetGrades(stuNo);}public Grade GetGrade([Service] IGradeRepository gradeRepository, int id){return gradeRepository.GetGrade(id);}}
}

GradeRepository.cs

using System.Collections.Generic;
using System.Linq;namespace GraphQLDemo03_Grades
{public interface IGradeRepository{IEnumerable<Grade> GetGrades(string stuNo);Grade GetGrade(int id);}public class GradeRepository : IGradeRepository{public IEnumerable<Grade> GetGrades(string stuNo){var grades = new List<Grade>(){new Grade(1,"S0001",100,"语文"),new Grade(2,"S0001",99,"数学"),new Grade(3,"S0002",98,"语文"),new Grade(4,"S0002",97,"数学")};return grades.Where(s => s.stuNo == stuNo);}public Grade GetGrade(int id){var grades = new List<Grade>(){new Grade(1,"S0001",100,"语文"),new Grade(2,"S0001",99,"数学"),new Grade(3,"S0002",98,"语文"),new Grade(4,"S0002",97,"数学")};return grades.SingleOrDefault(s => s.ID == id);}}public record Grade(int ID, string stuNo, float score, string subject);
}

最重要的是组合服务,即网关服务:GraphoQLDemo03_gateway

引入NuGet包

HotChocolate.AspNetCore

HotChocolate.Data

HotChocolate.Stitching

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;namespace GraphQLDemo03_gateway
{public class Startup{const string Students = "students";const string Grades = "grades";public void ConfigureServices(IServiceCollection services){services.AddHttpClient(Students, c => c.BaseAddress = new Uri("http://localhost:7000/graphql"));services.AddHttpClient(Grades, c => c.BaseAddress = new Uri("http://localhost:9000/graphql"));services.AddGraphQLServer().AddRemoteSchema(Students, ignoreRootTypes: true).AddRemoteSchema(Grades, ignoreRootTypes: true).AddTypeExtensionsFromString("type Query { }").AddTypeExtensionsFromFile("StudentStitching.graphql").AddTypeExtensionsFromFile("GradeStitching.graphql").AddTypeExtensionsFromFile("StudentExtendStitching.graphql").AddTypeExtensionsFromFile("GradeExtendStitching.graphql");}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGraphQL();});}}
}

学生的Query类型

extend type Query{getonestudent(stuNo:String): Student @delegate(schema: "students", path:"student(stuNo:$arguments:stuNo)")getstudents: [Student] @delegate(schema: "students", path:"students")
}

学生Student上扩展的属性grades集合

extend type Student{grades: [Grade] @delegate(schema: "grades", path:"grades(stuNo: $fields:stuNo)")
}

成绩的Query类型

extend type Query{getGrades(stuNo:String): [Grade] @delegate(schema: "grades", path:"grades(stuNo:$arguments:stuNo)")getGrade(id:Int!): Grade @delegate(schema: "grades", path:"grade(id:$arguments:id)") 
}

成绩实体上扩展的学生student实体属性

extend type Grade{student: Student @delegate(schema: "students", path:"student(stuNo: $fields:stuNo)")
}

网关项目中通过AddHttpClient把子服务地址添加进来,再通过AddRemoteSchema把子项的架构引入进来,通过AddTypeExtensionsFromFile添加.graphql定义文件,实现类型的定义和拼接,使应用达到灵活性。

这篇关于GraphQL:拼接Stitching的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/354127

相关文章

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

js操作Dom节点拼接表单及ajax提交表单

有时候我们不希望html(jsp、vm)中有创建太多的标签(dom节点),所以这些任务都由js来做,下面提供套完整的表单提交流程,只需要在html中添加两个div其余的都由js来做吧。下面原生代码只需略微修改就能达到你想要的效果。 1、需要创建表单的点击事件 <a href="javascript:void(0);"onclick="changeSettleMoney('$!doctor.do

【语句】如何将列表拼接成字符串并截取20个字符后面的

base_info = "".join(tree.xpath('/html/head/script[4]/text()'))[20:] 以下是对这个语句的详细讲解: tree.xpath('/html/head/script[4]/text()')部分: tree:通常是一个已经构建好的 HTML 文档树对象,它是通过相关的 HTML 解析库(比如 lxml)对 HTML 文档进行解

ASP.NET Core 入门教学十七 GraphQL入门指南

GraphQL 是一种用于 API 的查询语言,允许客户端请求所需的数据,并能够合并多个资源到一个请求中。在 ASP.NET Core 中使用 GraphQL 可以提供更灵活、高效和实用的数据查询方式。以下是 ASP.NET Core 中 GraphQL 的入门指南: 1. 安装必要的 NuGet 包 首先,你需要安装以下 NuGet 包: GraphQLGraphQL.Server.Tra

【Go - 拼接字符串】

在 Go 中,可以使用多种方式拼接字符串。以下是一些常见的方法: 使用 + 操作符 这是最简单的方式,适用于少量字符串的拼接。 str := "Hello, " + "world!" 使用 fmt.Sprintf 适用于需要格式化字符串的场景。 str := fmt.Sprintf("Hello, %s!", "world") 使用 strings.Builder 适用于需要高

graphQL 管理API的流行趋势

管理API的流行趋势为 graphQL   官网参考地址   https://graphql.org.cn/

javascript 拼接字符串

var names1=["aa","bb","hh"]; var names2=["cc","kk","jj"]; var nam=names1.concat(names2); console.log(nam); //运行结果    ["aa", "bb", "hh", "cc", "kk", "jj"]

也来测测javascript拼接字符串不同方法的效率

今天,对javascript中拼接字符串的两种方法做了个效率对比。第一种是 += 的方法,第二种 是join 。 代码实现如下: 第一种 += <script type="text/javascript">d1=new Date();var arr = [];for (var i = 0; i < 10000000; i++) {arr.push(i);};var str = '

华为OD机试 - 拼接URL(Python/JS/C/C++ 2024 D卷 100分)

一、题目描述 给定一个URL前缀和URL后缀,通过”,”分割,需要将其连接为一个完整的URL,如果前缀结尾和后缀开头都没有“/”,需自动补上“/”连接符,如果前缀结尾和后缀开头都为“/”,需自动去重。 约束:不用考虑前后缀URL不合法情况。 二、输入描述 URL前缀(一个长度小于100的字符串),URL后缀(一个长度小于100的字符串)。 三、输出描述 拼接后的URL。 四、解题思路

拼接数组/删除元素

矩阵拼接的函数tf.stack()与矩阵分解的函数tf.unstack() tf.unstack(value, num=None, axis=0, name='unstack')Unpacks the given dimension of a rank-`R` tensor into rank-`(R-1)` tensors.Unpacks `num` tensors from `value`