graphql

源代码
完成的源代码可以从GitHub克隆:




git clone https://github.com/callistaenterprise/goblog.git
git checkout P14
1.概述
系列博客的这一篇不会引入任何新的服务,它只会将新的/graphqlPOST端点添加到“accountservice”,该端点将按照我们将在Go代码中定义的graphql模式来响应请求。





  1. GraphQL
    GraphQL由Facebook在内部开发并于2015年公开发布。它为RESTful和其他架构提供了用于从服务器向客户端提供数据的另一种查询语言。也许最独特的特点是GraphQL允许客户端定义如何构造请求的数据,而不是让服务器决定。这意味着客户端可以准确地获取所需的数据,从而缓解这个经典问题,为手头用例获取到的数据太多或太少。



我建议你深入了解官方文档以获取更详细的解释。



3.graphql-go的模式
我们来快速浏览一下使用关键概念设置GraphQL模式(schema),例如类型(types),字段(fields),解析函数(resolve functions),根查询(root queries)和结果模式(resulting schema)。



3.1模式,类型和字段
模式定义了可以在GraphQL查询中使用的类型和字段。GraphQL不受任何特定的DSL或编程语言的束缚。由于这是一个Go博客,我将根据GitHub上的graphql-go/graphql项目使用Go语言GraphQL模式。

https://cloud.tencent.com/developer/article/1152796
https://graphql.org/
https://graphql.org/learn/introspection/
https://blog.csdn.net/belalds/article/details/88638115
https://blog.csdn.net/M2l0ZgSsVc7r69eFdTj/article/details/81117092



GraphQL是一种数据描述语言,而非编程语言,因此GraphQL缺乏用于描述数学表达式的标点符号。
注释只能用 # ,可以使用末尾的逗号提高可读性。
GraphQL的命名是大小写敏感的,也就是说name,Name,和NAME是不同的名字。
一个文档可以包含多个操作和片段的定义。一个查询文档只有包含操作时,服务器才能执行。
如果一个文档只有一个操作,那这个操作可以不带命名或者简写,省略掉query关键字和操作名。



https://cloud.tencent.com/developer/article/1332544



http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed19fa950d100b92235c438014648c83493e8ed45f93130a1c187ba1a621761b54d5c5793303ae4308feb56b32610c75f7c88ad25ddccbd17638885623011c913762c468d8dc3723d620e14d99dc0e96cae74491b9a3d5c85523dd230f6df1f79c2b0603bd18&p=97578615d9c040ad1fbe9b7c5953cf&newp=882a9644d49612a05ab9c368535182231610db2151d7d1126b82c825d7331b001c3bbfb423281707d5cf7a6200ac4f5ceff73670310923a3dda5c91d9fb4c57479dd&s=c43aa697165c1f99&user=baidu&fm=sc&query=GraphQL+%C2%DB%CE%C4+%BA%CB%D0%C4%B8%C5%C4%EE&qid=f3ecf82f0000628f&p1=1



https://www.jianshu.com/p/cb89d3cf1395



一年多以前就听说了GraphQL,前段时间接触了一个海归团队(创始人就来自Facebook),技术栈使用Graphql+Apollo+React,在他们的指导下试用了一下觉得真心酷。遂花了半个多月了解了GraphQL的主要思想和基本用法,碰巧看到一篇文章)把GraphQL的核心概念讲的比较清晰易懂,依据该文,大致翻译如下,如果你也对GraphQL感兴趣,欢迎一起来讨论。



什么是GraphQL:



给API设计的一种查询语言,一个依据已有数据执行查询的运行时,为你的API中的数据提供一种完全且容易理解的描述,使得API能够更容易的随着时间而演变,还支持强大的开发者工具。



虽然名字叫做GraphQL 但是和数据库本身并没有直接关系。



GraphQL的特征:



可描述性的:使用GraphQL,你获取的都是你想要的数据,不多也不会少;
分级性的:GraphQL天然遵循对象间的关系,通过一个简单的请求,我们可以获取到一个对象及其相关的对象,比如说,通过一个简单的请求,我们可以获取一个作者和他创建的所有文章,然后可以获取文章的所有评论;
强类型的:使用GraphQL的类型系统,我们可以描述能够被服务器查询的可能的数据,然后确保从服务器获取到的数据和我们查询的一致;
不做语言限制:并不绑定于某一特定的语言,实际上现在已经有一些不同的语言有了实践;
兼容于任何后台:GraphQL不限于某一特定数据库,可以使用已经存在的数据,代码,甚至可以连接第三方的APIs.
好反省的:GraphQL服务器能够查询架构的细节。
GraphQL的核心包括Query,Mutation,Schemas等等,每个概念下又有一些子概念,下面分别做简单的介绍:



Query
Queries用做读操作,也就是从服务器获取数据。Queries定义了我们对模式执行的行为。



对query结果的解释
如果一个操作没有type,GraphQL默认会把这些操作看做query。query还可以拥有名字,虽然是可选的,但是可以帮助识别某个query是做什么的。



query也可以拥有注释,注释以#开头。



Field
Field是我们想从服务器获取的对象的基本组成部分。上述代码中name就是author对象的一个Field.



Argument
和普通的函数一样,query可以拥有参数,参数是可选的或需求的。



Mutation
传统的API使用场景中,我们会有需要修改服务器上数据的场景,mutations就是应这种场景而生。mutations被用以执行写操作,通过mutations我们会给服务器发送请求来修改和更新数据,并且会接收到包含更新数据的反馈。



Schemas
Schemas 描述了 数据的组织形态 以及服务器上的那些数据能够被查询,Schemas提供了你数据中可用的数据的对象类型,GraphQL中的对象是强类型的,因此schema中定义的所有的对象必须具备类型。类型允许GraphQL服务器确定查询是否有效或者是否在运行时。Schemas可用是两种类型Query和Mutation。



https://segmentfault.com/a/1190000011263214



https://zhuanlan.zhihu.com/p/21834335?utm_source=qq&utm_medium=social



https://www.graphql-tools.com/docs/generate-schema/
https://github.com/ardatan/graphql-tools



https://walmartlabs.github.io//
https://graphqleditor.com/



与传统的客户端/服务器通信模式相比,GraphQL 的引入为整个系统增加了一个中间层,屏蔽了前后端的具体数据结构。其主要优势包括以下几点:



定制所需的数据 :客户端可以定制自己想要的数据结构。通过在请求中声明所需的数据结构,从 GraphQL Service 中获取想要的数据。Service 返回的数据结构将与客户端的请求完全一致,从而减少冗余数据的传输。在不使用 GraphQL 的情况下,返回的数据格式不受客户端控制。
单个请求获取多个资源 :在 GraphQL 中,客户端不再关心请求的来源,而是直接将需要的资源写入请求字段。在不使用 GraphQL 的情况下,当需要从不同的 Service 取得数据时,客户端开发者需要对不同的 Service 发起请求。
结构即文档 :GraphQL 具有友好的调试界面,开发者可直接在该界面中查询 GraphQL 提供的服务。这种数据结构即文档的显示方式,使开发者能够方便快捷地查找所需要的数据类型。
订阅功能 :GraphQL 提供订阅功能,使得客户端能够监听数据变化,让 GraphQL Service 能够主动将变动的数据推送至客户端,实时在界面上进行显示。



https://developer.ibm.com/zh/articles/wa-using-graphgl-to-customize-data-structure/



GraphQL 的基本操作
GraphQL 的主要操作包括查询 (Query)、变更 (Mutation) 和订阅 (Subscription)。客户端通过 Query 从 Service 获取数据,通过 Mutation 向 Service 发起变更操作(增删改),通过 Subscription 向 Service 发起订阅请求并建立套接字链接,监听相关数据的变更。



查询 (Query)
假设 Service 已提供获取全部课程的操作 courses 及通过 id 获取 course 的操作 course(String id) 。需要获取所有课程的 id 及对应的评论时,对应的请求可写作



变更 (Mutation)
假设 Service 已提供增加课程的操作 add (Course course) ,修改课程的操作 update (String id, Course course) ,移除课程的操作 remove (String id) , 对应的客户端请求可写作



订阅 (Subscription)
假设 Service 已提供订阅所有课程信息的操作,客户端想要保持监听,对应的请求可写作



https://developer.ibm.com/zh/articles/wa-using-graphgl-to-customize-data-structure/



https://xiaomingplus.com/full-stack/graphql-intro/



首先我们肯定会在客户端上书写查询语句,查询语句在发送到服务端之前会转换为标准的请求体。
这些参数表达了客户端的诉求:调用哪个方法,传递什么样的参数,返回哪些字段。



服务端拿到这段Schema之后,通过事先定义好的服务端Schema接收请求参数,校验参数,然后执行对应的resolver函数,执行完成返回数据。



https://juejin.im/post/5ceb1e28f265da1bb80c0b70



https://juejin.im/post/5b9b650df265da0afe62cf4e



https://graphql.org/code/
https://www.jianshu.com/p/d473563c79ef



https://graphql.cn/learn/schema/#type-system



Category golang