[TOC]
GraphQL语言学习
下面所有GraphQL文档都可以在在线graphiql网站上面运行测试。
核心概念
GraphQL的三种操作:查询(query)、变更(mutation)、订阅(subscription)
这是一个带有查询操作的GraphQL文档示例:
query{ |
字段
一个GraphQL字段描述一条独立信息。该信息可简单可复杂,含有数据之间的关系。在上述文档,操作中包含的全部内容,即users、id和name都是字段。
参数
将字段想象成可以返回值的函数,他们也可以接收行为不同的参数,如:
users(limit:5,order_by: {id:asc}) |
该示例中,users字段接收参数limit,以限制返回的结果的数量,order_by
参数用来将返回的结果进行排序,{id:asc}
表示以id字段进行升序排序。
变量
query ($limit: Int) { |
该变量在操作的顶部定义,且该变量的值可由客户端以服务器理解的格式发送。 通常变量以JSON表示,如下所示:
{ |
操作名称
当文档中含有多个操作时,服务器必须了解执行哪些操作并以相同的顺序将结果映射回来。 例如:
query fetchUser { |
片段
片段可以提高GraphQL的重用性。 如果文档中的某些部分在给定的类型上重用相同的字段集,那么片段就大有帮助。如:
fragment userFields on users{ |
此处对片段的使用...userFields
,这种用法叫作片段扩展。 还有内联片段,即没有分别明确声明片段却在查询中内联使用了它。
指示
GraphQL规范支持的一些默认服务器指示包括:
- @deprecated(reason: String) - 将字段标为已弃用
- @skip(if: Boolean) - 跳过该字段的 GraphQL 执行
- @include(if: Boolean) - 如果为 true,则为带注解的字段调用解析器。
query ($showName: Boolean!){ |
内省查询
简单来说就是,GraphQL内置了接口文档,你可以通过内省的方法获得这些信息,如对象定义、接口参数等信息。
GraphQL服务器公开以下有关Query操作类型的内省查询:
- __schema
- __type
- __typename
当使用者不知道某个GraphQL接口中的类型哪些是可用的,可以通过__schema字段来向GraphQL查询哪些类型是可用的。如:
{ |

CTF例题
[NewStarCTF 公开赛赛道]ezAPI
payload:
id=1&data={"query":"{\n __schema{\n types{\n name\n }\n }\n}\n\n","variables":null} |
参考文章: