zehuawong 2019-06-21
英文原版地址:https://www.howtographql.com/...
您可能已经意识到,GraphQL生态系统正在以惊人的速度增长。之所以如此,原因之一是GraphQL使我们很容易开发出优秀的工具。在本节中,我们将看到为什么会这样,以及已经存在生态系统中有的一些惊人的工具。
如果您熟悉GraphQL基础知识,您可能知道GraphQL的类型系统如何帮助我们快速定义API的最外层。它允许开发人员清楚地定义API的功能,还可以根据Schema去验证传入的查询内容。
GraphQL神奇的是,这些功能不仅仅是服务器所知道的。GraphQL允许客户端向服务器询问其Schema的信息。 GraphQL调用这个introspection。
模式的设计者已经知道模式是什么样的,但客户端如何得知,可以通过GraphQL API访问哪些数据?我们可以通过查询__schema
元字段来询问GraphQL,该元字段始终在符合规范的查询根类型上可用。
query { __schema { types { name } } }
以此Schema为例:
type Query { author(id: ID!): Author } type Author { posts: [Post!]! } type Post { title: String! }
如果我们发送上述的introspection查询,我们会得到以下结果:
{ "data": { "__schema": { "types": [ { "name": "Query" }, { "name": "Author" }, { "name": "Post" }, { "name": "ID" }, { "name": "String" }, { "name": "__Schema" }, { "name": "__Type" }, { "name": "__TypeKind" }, { "name": "__Field" }, { "name": "__InputValue" }, { "name": "__EnumValue" }, { "name": "__Directive" }, { "name": "__DirectiveLocation" } ] } } }
我们可以看到,我们查询了Schema上的所有类型。我们得到我们定义的对象类型和预定义类型。我们甚至可以再查询introspection类型!
对于introspection类型,不仅仅能拿到名字。看下面的例子:
{ __type(name: "Author") { name description } }
在这个例子中,我们使用__type元字段来查询一个类型,我们得到它的名字和描述。此查询的结果:
{ "data": { "__type": { "name": "Author", "description": "The author of a post.", } } }
如你所见,introspection是GraphQL非常强大的功能,我们只是了解了一点皮毛。在规范中,会详细介绍introspection模式中哪些字段和类型是可用的。
GraphQL生态系统中的许多工具都是通过introspection系统提供了神奇的功能。例如文档浏览器,自动补全,代码生成,和其他一切可能!在构建和使用GraphQL API时,当你重度使用introspection ,最有用的工具是GraphiQL。
GraphiQL是用于编写,验证和测试GraphQL查询的运行在浏览器中的IDE。它有用于GraphQL查询的编辑器,配有自动补全和验证以及文档浏览,可以快速呈现出模式的结构(由introspection提供)。
这是一个非常强大的开发工具。它允许您在GraphQL服务器上调试和尝试查询,而无需通过curl去写GraphQL查询。