我想从服务器获取架构。 我可以获得所有类型的实体,但我无法获得属性。
获取所有类型:
<td class="alien alien1"></td>
如何获取类型的属性:
query {
__schema {
queryType {
fields {
name
type {
kind
ofType {
kind
name
}
}
}
}
}
}
如何只在1个请求中获取包含属性的所有类型?或者更好:我怎样才能使用mutators,enums,types ...来获得整个架构。
答案 0 :(得分:55)
<强>更新强>
现在,使用graphql-cli
是获取和更新架构的推荐工作流程。
以下命令将帮助您入门:
# install via NPM
npm install -g graphql-cli
# Setup your .graphqlconfig file (configure endpoints + schema path)
graphql init
# Download the schema from the server
graphql get-schema
您甚至可以通过运行以下内容来监听架构更改并不断更新架构:
graphql get-schema --watch
如果您只想下载GraphQL架构,请使用以下方法:
获取GraphQL架构的最简单方法是使用CLI工具get-graphql-schema。
您可以通过NPM安装它:
npm install -g get-graphql-schema
有两种方法可以获取架构。 1)GraphQL IDL格式或2)JSON内省查询格式。
get-graphql-schema ENDPOINT_URL > schema.graphql
get-graphql-schema --json ENDPOINT_URL > schema.json
或
get-graphql-schema -j ENDPOINT_URL > schema.json
有关详细信息,请参阅以下教程:How to download the GraphQL IDL Schema
答案 1 :(得分:21)
这是GraphiQL使用的查询(网络捕获):
query IntrospectionQuery {
__schema {
queryType {
name
}
mutationType {
name
}
subscriptionType {
name
}
types {
...FullType
}
directives {
name
description
locations
args {
...InputValue
}
}
}
}
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}
fragment InputValue on __InputValue {
name
description
type {
...TypeRef
}
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
答案 2 :(得分:9)
您可以使用GraphQL-JS的内省查询来获取您想要了解的所有模式:
import { introspectionQuery } from 'graphql';
如果您只想要类型信息,可以使用:
{
__schema: {
types: {
...fullType
}
}
}
使用内省查询中的以下片段:
fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}
fragment InputValue on __InputValue {
name
description
type { ...TypeRef }
defaultValue
}
fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
`;
如果这看起来很复杂,那是因为字段可以在nonNulls和Lists中深度包含任意性,这意味着如果你的字段被包装在7层以上,技术上甚至上面的查询都不能反映完整的模式(这可能不是这样的。)
您可以看到introspectionQuery here的源代码。
答案 3 :(得分:3)
您可以使用Hasura的graphqurl
实用程序
npm install -g graphqurl
gq <endpoint> --introspect > schema.graphql
# or if you want it in json
gq <endpoint> --introspect --format json > schema.json
答案 4 :(得分:2)
您可以使用IntelliJ插件JS GraphQL
,然后IDEA会要求您创建两个文件“ graphql.config.json”和“ graphql.schema.json”
然后,您可以编辑“ graphql.config.json”以指向本地或远程GraphQL服务器:
"schema": {
"README_request" : "To request the schema from a url instead, remove the 'file' JSON property above (and optionally delete the default graphql.schema.json file).",
"request": {
"url" : "http://localhost:4000",
"method" : "POST",
"README_postIntrospectionQuery" : "Whether to POST an introspectionQuery to the url. If the url always returns the schema JSON, set to false and consider using GET",
"postIntrospectionQuery" : true,
"README_options" : "See the 'Options' section at https://github.com/then/then-request",
"options" : {
"headers": {
"user-agent" : "JS GraphQL"
}
}
}
之后,IDEA插件将自动从GraphQL服务器加载模式,并在控制台中显示模式json,如下所示:
Loaded schema from 'http://localhost:4000': {"data":{"__schema":{"queryType":{"name":"Query"},"mutationType":{"name":"Mutation"},"subscriptionType":null,"types":[{"kind":"OBJECT","name":"Query","description":"","fields":[{"name":"launche
答案 5 :(得分:2)
您可以使用GraphQL-Codegen with the ast-plugin
npm install --save graphql
npm install --save-dev @graphql-codegen/cli
npx graphql-codegen init
按照步骤生成codegen.yml
文件
安装该工具后,您可以使用该插件下载架构 schema-ast
最好是按照页面上的说明进行安装……但基本上:
npm install --save-dev @graphql-codegen/schema-ast
然后配置 codegen.yml
文件以设置哪些模式是真实来源以及将下载的模式文件放在哪里:
schema:
- 'http://localhost:3000/graphql'
generates:
path/to/file.graphql:
plugins:
- schema-ast
config:
includeDirectives: true
答案 6 :(得分:1)
apollo schema:download --endpoint=http://localhost:4000/graphql schema.json
答案 7 :(得分:1)
请参阅https://stackoverflow.com/a/42010467/10189759
想指出的是,如果需要身份验证,您可能不能仅使用从graphql init
生成的配置文件
例如,您可能必须使用github graphql API来做类似的事情
{
"projects": {
"graphqlProjectTestingGraphql": {
"schemaPath": "schema.graphql",
"extensions": {
"endpoints": {
"dev": {
"url": "https://api.github.com/graphql",
"headers": {
"Authorization": "Bearer <Your token here>"
}
}
}
}
}
}
}
答案 8 :(得分:0)
如果您想自己做,请阅读以下代码:
有一个模块化的先进工具“graphql-cli”,考虑一下。它使用package“graphql”的buildClientSchema从内省数据构建IDL .graphql文件。
答案 9 :(得分:0)
您可以使用以下命令下载远程GraphQL服务器的架构。命令执行成功后,您应该在当前工作目录中看到一个名为schema.json
的新文件。
~$ npx apollo-cli download-schema $GRAPHQL_URL --output schema.json
答案 10 :(得分:0)
您可以使用apollo codegen:client
。参见https://github.com/apollographql/apollo-tooling#apollo-clientcodegen-output
答案 11 :(得分:0)
不知何故,我无法使用任何建议的 CLI 工具以 GraphQL 的模式定义语言 (SDL) 而不是内省结果 JSON 输出模式。我最终拼凑了一个非常快速的 Node 脚本,让 GraphQL 库为我完成:
const fs = require("fs");
const { buildClientSchema, getIntrospectionQuery, printSchema } = require("graphql");
const fetch = require("node-fetch");
async function saveSchema(endpoint, filename) {
const response = await fetch(endpoint, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query: getIntrospectionQuery() })
});
const graphqlSchemaObj = buildClientSchema((await response.json()).data);
const sdlString = printSchema(graphqlSchemaObj);
fs.writeFileSync(filename, sdlString);
}
saveSchema("https://example.com/graphql", "schema.graphql");
getIntrospectionQuery()
拥有获取一切所需的完整内省查询,然后 buildClientSchema()
和 printSchema()
将 JSON 混乱转化为 GraphQL SDL。
将其变成 CLI 工具本身并不太难,但这感觉有点过分了。