diff --git a/docs/graphql.html b/docs/graphql.html new file mode 100644 index 00000000..87d6cd1c --- /dev/null +++ b/docs/graphql.html @@ -0,0 +1,689 @@ + + +
+ +这份快速参考备忘单提供了 GraphQL 的简要概述
+:- | - |
---|---|
schema | GraphQL 架构定义 |
query | 读取和遍历数据 |
mutation | 修改数据或触发动作 |
subscription | 发生事件时运行查询 |
:- | - |
---|---|
Int | 有符号 32 位整数 |
Float | 有符号双精度浮点值 |
String | UTF-8 字符序列 |
Boolean | 对或错布尔值类型 |
ID | 唯一标识符 |
:- | - |
---|---|
scalar | 标量类型 |
type | 对象类型 |
interface | 接口类型 |
union | 联合类型 |
enum | 枚举类型 |
input | 输入对象类型 |
:- | - |
---|---|
String | 可空字符串 |
String! | 非空字符串 |
[String] | 可空字符串列表 |
[String]! | 可空字符串的非空列表 |
[String!]! | 非空字符串的非空列表 |
type Query {
+ users(limit: Int): [User]
+}
+
+type Query {
+ users(limit: Int = 10): [User]
+}
+
+type Query {
+ users(limit: Int, sort: String): [User]
+}
+
+type Query {
+ users(limit: Int = 10, sort: String): [User]
+}
+type Query {
+ users(limit: Int, sort: String = "asc"): [User]
+}
+type Query {
+ users(limit: Int = 10, sort: String = "asc"): [User]
+}
+
+
+input ListUsersInput {
+ limit: Int
+ since_id: ID
+}
+
+type Mutation {
+ users(params: ListUsersInput): [User]!
+}
+
+scalar Url
+type User {
+ name: String
+ homepage: Url
+}
+
+interface Foo {
+ is_foo: Boolean
+}
+interface Goo {
+ is_goo: Boolean
+}
+type Bar implements Foo {
+ is_foo: Boolean
+ is_bar: Boolean
+}
+type Baz implements Foo, Goo {
+ is_foo: Boolean
+ is_goo: Boolean
+ is_baz: Boolean
+}
+
+实现一个或多个接口的对象
+type Foo {
+ name: String
+}
+type Bar {
+ is_bar: String
+}
+union SingleUnion = Foo
+union MultipleUnion = Foo | Bar
+type Root {
+ single: SingleUnion
+ multiple: MultipleUnion
+}
+
+一个或多个对象的联合
+enum USER_STATE {
+ NOT_FOUND
+ ACTIVE
+ INACTIVE
+ SUSPENDED
+}
+type Root {
+ stateForUser(userID: ID!): USER_STATE!
+ users(state: USER_STATE, limit: Int = 10): [User]
+}
+
+
+{
+ hero {
+ name
+ }
+}
+
+结果:
+{
+ "data": {
+ "hero": {
+ "name": "R2-D2"
+ }
+ }
+}
+
+{
+ hero {
+ name
+ # 查询可以有注释!
+ friends {
+ name
+ }
+ }
+}
+
+结果:
+{
+ "data": {
+ "hero": {
+ "name": "R2-D2",
+ "friends": [
+ { "name": "Luke Skywalker" },
+ { "name": "Han Solo" }
+ ]
+ }
+ }
+}
+
+{
+ human(id: "1000") {
+ name
+ height
+ }
+}
+
+结果:
+{
+ "data": {
+ "human": {
+ "name": "Luke Skywalker",
+ "height": 1.72
+ }
+ }
+}
+
+{
+ human(id: "1000") {
+ name
+ height(unit: FOOT)
+ }
+}
+
+结果:
+{
+ "data": {
+ "human": {
+ "name": "Luke Skywalker",
+ "height": 5.6430448
+ }
+ }
+}
+
+{
+ empireHero: hero(episode: EMPIRE) {
+ name
+ }
+ jediHero: hero(episode: JEDI) {
+ name
+ }
+}
+
+结果:
+{
+ "data": {
+ "empireHero": {
+ "name": "Luke Skywalker"
+ },
+ "jediHero": {
+ "name": "R2-D2"
+ }
+ }
+}
+
+{
+ leftComparison: hero(episode: EMPIRE) {
+ ...comparisonFields
+ }
+ rightComparison: hero(episode: JEDI) {
+ ...comparisonFields
+ }
+}
+
+fragment comparisonFields on Character {
+ name
+ appearsIn
+ friends {
+ name
+ }
+}
+
+结果:
+{
+ "data": {
+ "leftComparison": {
+ "name": "Luke Skywalker",
+ "appearsIn": [
+ "NEWHOPE",
+ "EMPIRE",
+ "JEDI"
+ ],
+ "friends": [
+ { "name": "Han Solo" },
+ { "name": "Leia Organa" },
+ { "name": "C-3PO" },
+ { "name": "R2-D2" }
+ ]
+ },
+ "rightComparison": {
+ "name": "R2-D2",
+ "appearsIn": [
+ "NEWHOPE",
+ "EMPIRE",
+ "JEDI"
+ ],
+ "friends": [
+ { "name": "Luke Skywalker" },
+ { "name": "Han Solo" },
+ { "name": "Leia Organa" }
+ ]
+ }
+ }
+}
+
+query HeroComparison($first: Int = 3) {
+ leftComparison: hero(episode: EMPIRE) {
+ ...comparisonFields
+ }
+ rightComparison: hero(episode: JEDI) {
+ ...comparisonFields
+ }
+}
+
+fragment comparisonFields on Character {
+ name
+ friendsConnection(first: $first) {
+ totalCount
+ edges {
+ node {
+ name
+ }
+ }
+ }
+}
+
+结果:
+{
+ "data": {
+ "leftComparison": {
+ "name": "Luke Skywalker",
+ "friendsConnection": {
+ "totalCount": 4,
+ "edges": [
+ {
+ "node": {
+ "name": "Han Solo"
+ }
+ },
+ {
+ "node": {
+ "name": "Leia Organa"
+ }
+ }
+ ]
+ }
+ },
+ "rightComparison": {
+ "name": "R2-D2",
+ "friendsConnection": {
+ "totalCount": 3,
+ "edges": [
+ {
+ "node": {
+ "name": "Luke Skywalker"
+ }
+ },
+ {
+ "node": {
+ "name": "Han Solo"
+ }
+ }
+ ]
+ }
+ }
+ }
+}
+
+query HeroNameAndFriends {
+ hero {
+ name
+ friends {
+ name
+ }
+ }
+}
+
+结果:
+{
+ "data": {
+ "hero": {
+ "name": "R2-D2",
+ "friends": [
+ { "name": "Luke Skywalker" },
+ { "name": "Han Solo" },
+ { "name": "Leia Organa" }
+ ]
+ }
+ }
+}
+
+# { "graphiql": true, "variables": { "episode": JEDI } }
+query HeroNameAndFriends($episode: Episode) {
+ hero(episode: $episode) {
+ name
+ friends {
+ name
+ }
+ }
+}
+
+
+变量前缀必须为 $
,后跟其类型
query HeroNameAndFriends($episode: Episode = "JEDI") {
+ hero(episode: $episode) {
+ name
+ friends {
+ name
+ }
+ }
+}
+
+
+query Hero($episode: Episode, $withFriends: Boolean!) {
+ hero(episode: $episode) {
+ name
+ friends @include(if: $withFriends) {
+ name
+ }
+ }
+}
+
+
+{ "episode": "JEDI", "withFriends": false }
+
+结果:
+{
+ "data": { "hero": { "name": "R2-D2" } }
+}
+
+@include(if: Boolean)
仅在参数为 true
时,包含此字段@skip(if: Boolean)
如果参数为 true
,跳过此字段mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
+ createReview(episode: $ep, review: $review) {
+ stars
+ commentary
+ }
+}
+
+
+{
+ "ep": "JEDI",
+ "review": {
+ "stars": 5,
+ "commentary": "This is a great movie!"
+ }
+}
+
+结果:
+{
+ "data": {
+ "createReview": {
+ "stars": 5,
+ "commentary": "This is a great movie!"
+ }
+ }
+}
+
+query HeroForEpisode($ep: Episode!) {
+ hero(episode: $ep) {
+ name
+ ... on Droid {
+ primaryFunction
+ }
+ ... on Human {
+ height
+ }
+ }
+}
+
+{ "ep": "JEDI" }
+
+结果:
+{
+ "data": {
+ "hero": {
+ "name": "R2-D2",
+ "primaryFunction": "Astromech"
+ }
+ }
+}
+
+{
+ search(text: "an") {
+ __typename
+ ... on Human {
+ name
+ }
+ ... on Droid {
+ name
+ }
+ ... on Starship {
+ name
+ }
+ }
+}
+
+结果:
+{
+ "data": {
+ "search": [
+ {
+ "__typename": "Human",
+ "name": "Han Solo"
+ },
+ {
+ "__typename": "Human",
+ "name": "Leia Organa"
+ },
+ {
+ "__typename": "Starship",
+ "name": "TIE Advanced x1"
+ }
+ ]
+ }
+}
+
+