.github
.husky
assets
docs
adobe-lightroom.md
adobe-photoshop.md
adobe-xd.md
android-studio.md
ansible.md
apt.md
aspect-ratio.md
awk.md
bash.md
c.md
cargo.md
chmod.md
cmake.md
cmd.md
cocoapods.md
colors-named.md
conan.md
cpp.md
cron.md
cs.md
css.md
curl.md
dart.md
djiango.md
docker.md
dockerfile.md
electron.md
emacs.md
emmet.md
emoji.md
es6.md
expressjs.md
ffmpeg.md
find.md
firefox.md
flutter.md
git.md
github-actions.md
github.md
gitlab-ci.md
gitlab.md
gmail.md
golang.md
google-chrome.md
graphql.md
grep.md
homebrew.md
html-char.md
html.md
htmx.md
htop.md
http-status-code.md
ini.md
iptables.md
iso-639-1.md
java.md
javascript.md
jest.md
jq.md
json.md
julia.md
koajs.md
kotlin.md
laravel.md
latex.md
lerna.md
lessjs.md
lsof.md
lua.md
make.md
markdown.md
matlab.md
mime.md
mitmproxy.md
mysql.md
nestjs.md
netcat.md
netstat.md
nextjs.md
nginx.md
npm.md
openssl.md
oracle.md
package.json.md
php.md
pm2.md
postgres.md
python.md
pytorch.md
quickreference.md
react-native.md
react.md
redis.md
regex.md
resolutions.md
ruby.md
rust.md
sass.md
screen.md
sed.md
semver.md
sketch.md
ssh.md
styled-components.md
stylus.md
sublime-text.md
swift.md
swiftui.md
sysdig.md
systemd.md
tar.md
tmux.md
toml.md
typescript.md
vim.md
vscode.md
vue.md
vue2.md
webstorm.md
xcode.md
xpath.md
yaml.md
yarn.md
yum.md
.dockerignore
.editorconfig
.gitattributes
.gitignore
.lintstagedrc
.markdownlint.json
.npmrc
.prettierignore
.prettierrc
.refsrc.json
CONTRIBUTING.md
Dockerfile
LICENSE
README.md
package.json
renovate.json
654 lines
8.8 KiB
Markdown
654 lines
8.8 KiB
Markdown
GraphQL 备忘清单
|
||
===
|
||
|
||
这份快速参考备忘单提供了 [GraphQL](https://graphql.org/) 的简要概述
|
||
|
||
入门
|
||
---
|
||
|
||
### 概述
|
||
|
||
- RESTful API 的另一种方法
|
||
- GraphQL 是一种 API 查询语言
|
||
- 使用清晰的共享术语轻松描述 GraphQL API 的形状。
|
||
- 客户端发出查询/突变以读取和更新数据
|
||
- GraphQL 语法可以表达复杂的实体关系
|
||
- 用 [不同语言](https://graphql.org/code/) 实现 GraphQL 的库
|
||
|
||
[GraphQL](https://graphql.org/)
|
||
|
||
### Schema
|
||
|
||
:-|-
|
||
:-|-
|
||
`schema` | GraphQL 架构定义
|
||
`query` | 读取和遍历数据
|
||
`mutation` | 修改数据或触发动作
|
||
`subscription` | 发生事件时运行查询
|
||
|
||
### 内置标量类型
|
||
|
||
:-|-
|
||
:-|-
|
||
`Int` | 有符号 32 位整数
|
||
`Float` | 有符号双精度浮点值
|
||
`String` | UTF-8 字符序列
|
||
`Boolean` | 对或错布尔值类型
|
||
`ID` | 唯一标识符
|
||
|
||
### 类型定义
|
||
|
||
:-|-
|
||
:-|-
|
||
`scalar` | 标量类型
|
||
`type` | 对象类型
|
||
`interface` | 接口类型
|
||
`union` | 联合类型
|
||
`enum` | 枚举类型
|
||
`input` | 输入对象类型
|
||
|
||
### 类型修饰符
|
||
|
||
:-|-
|
||
:-|-
|
||
`String` | 可空字符串
|
||
`String!` | 非空字符串
|
||
`[String]` | 可空字符串列表
|
||
`[String]!` | 可空字符串的非空列表
|
||
`[String!]!` | 非空字符串的非空列表
|
||
|
||
### 输入参数
|
||
<!--rehype:wrap-class=row-span-2-->
|
||
|
||
#### 基本输入
|
||
|
||
```graphql
|
||
type Query {
|
||
users(limit: Int): [User]
|
||
}
|
||
```
|
||
|
||
#### 输入默认值
|
||
|
||
```graphql
|
||
type Query {
|
||
users(limit: Int = 10): [User]
|
||
}
|
||
```
|
||
|
||
#### 具有多个参数的输入
|
||
|
||
```graphql
|
||
type Query {
|
||
users(limit: Int, sort: String): [User]
|
||
}
|
||
```
|
||
|
||
#### 具有多个参数和默认值的输入
|
||
|
||
```graphql
|
||
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]
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
### 输入类型
|
||
|
||
```graphql
|
||
input ListUsersInput {
|
||
limit: Int
|
||
since_id: ID
|
||
}
|
||
```
|
||
|
||
```graphql
|
||
type Mutation {
|
||
users(params: ListUsersInput): [User]!
|
||
}
|
||
```
|
||
|
||
### 自定义标量
|
||
|
||
```graphql
|
||
scalar Url
|
||
type User {
|
||
name: String
|
||
homepage: Url
|
||
}
|
||
```
|
||
|
||
### 接口
|
||
|
||
```graphql
|
||
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
|
||
}
|
||
```
|
||
|
||
实现一个或多个接口的对象
|
||
|
||
### 联合
|
||
|
||
```graphql
|
||
type Foo {
|
||
name: String
|
||
}
|
||
type Bar {
|
||
is_bar: String
|
||
}
|
||
union SingleUnion = Foo
|
||
union MultipleUnion = Foo | Bar
|
||
type Root {
|
||
single: SingleUnion
|
||
multiple: MultipleUnion
|
||
}
|
||
```
|
||
|
||
一个或多个对象的联合
|
||
|
||
### 枚举
|
||
|
||
```graphql
|
||
enum USER_STATE {
|
||
NOT_FOUND
|
||
ACTIVE
|
||
INACTIVE
|
||
SUSPENDED
|
||
}
|
||
type Root {
|
||
stateForUser(userID: ID!): USER_STATE!
|
||
users(state: USER_STATE, limit: Int = 10): [User]
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
查询和变更(Mutations)
|
||
---
|
||
|
||
### 字段
|
||
|
||
```graphql
|
||
{
|
||
hero {
|
||
name
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"hero": {
|
||
"name": "R2-D2"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 查询可以有注释
|
||
|
||
```graphql
|
||
{
|
||
hero {
|
||
name
|
||
# 查询可以有注释!
|
||
friends {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"hero": {
|
||
"name": "R2-D2",
|
||
"friends": [
|
||
{ "name": "Luke Skywalker" },
|
||
{ "name": "Han Solo" }
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 参数 Arguments
|
||
|
||
```graphql
|
||
{
|
||
human(id: "1000") {
|
||
name
|
||
height
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"human": {
|
||
"name": "Luke Skywalker",
|
||
"height": 1.72
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 不同类型的参数
|
||
|
||
```graphql
|
||
{
|
||
human(id: "1000") {
|
||
name
|
||
height(unit: FOOT)
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"human": {
|
||
"name": "Luke Skywalker",
|
||
"height": 5.6430448
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 别名(Aliases)
|
||
|
||
```graphql
|
||
{
|
||
empireHero: hero(episode: EMPIRE) {
|
||
name
|
||
}
|
||
jediHero: hero(episode: JEDI) {
|
||
name
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"empireHero": {
|
||
"name": "Luke Skywalker"
|
||
},
|
||
"jediHero": {
|
||
"name": "R2-D2"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 片段(Fragments)
|
||
<!--rehype:wrap-class=row-span-2-->
|
||
|
||
```graphql
|
||
{
|
||
leftComparison: hero(episode: EMPIRE) {
|
||
...comparisonFields
|
||
}
|
||
rightComparison: hero(episode: JEDI) {
|
||
...comparisonFields
|
||
}
|
||
}
|
||
|
||
fragment comparisonFields on Character {
|
||
name
|
||
appearsIn
|
||
friends {
|
||
name
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"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" }
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 在片段内使用变量
|
||
<!--rehype:wrap-class=row-span-3-->
|
||
|
||
```graphql
|
||
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
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"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"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 操作名称(Operation name)
|
||
|
||
```graphql
|
||
query HeroNameAndFriends {
|
||
hero {
|
||
name
|
||
friends {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"hero": {
|
||
"name": "R2-D2",
|
||
"friends": [
|
||
{ "name": "Luke Skywalker" },
|
||
{ "name": "Han Solo" },
|
||
{ "name": "Leia Organa" }
|
||
]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 变量(Variables)
|
||
|
||
```graphql
|
||
# { "graphiql": true, "variables": { "episode": JEDI } }
|
||
query HeroNameAndFriends($episode: Episode) {
|
||
hero(episode: $episode) {
|
||
name
|
||
friends {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
变量前缀必须为 `$`,后跟其类型
|
||
|
||
### 默认变量(Default variables)
|
||
|
||
```graphql
|
||
query HeroNameAndFriends($episode: Episode = "JEDI") {
|
||
hero(episode: $episode) {
|
||
name
|
||
friends {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
### 指令(Directives)
|
||
|
||
```graphql
|
||
query Hero($episode: Episode, $withFriends: Boolean!) {
|
||
hero(episode: $episode) {
|
||
name
|
||
friends @include(if: $withFriends) {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
----
|
||
|
||
```graphql
|
||
{ "episode": "JEDI", "withFriends": false }
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": { "hero": { "name": "R2-D2" } }
|
||
}
|
||
```
|
||
|
||
- `@include(if: Boolean)` 仅在参数为 `true` 时,包含此字段
|
||
- `@skip(if: Boolean)` 如果参数为 `true`,跳过此字段
|
||
|
||
### 变更(Mutations)
|
||
|
||
```graphql
|
||
mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
|
||
createReview(episode: $ep, review: $review) {
|
||
stars
|
||
commentary
|
||
}
|
||
}
|
||
```
|
||
<!--rehype:className=wrap-text -->
|
||
|
||
----
|
||
|
||
```
|
||
{
|
||
"ep": "JEDI",
|
||
"review": {
|
||
"stars": 5,
|
||
"commentary": "This is a great movie!"
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"createReview": {
|
||
"stars": 5,
|
||
"commentary": "This is a great movie!"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 内联片段(Inline Fragments)
|
||
|
||
```graphql
|
||
query HeroForEpisode($ep: Episode!) {
|
||
hero(episode: $ep) {
|
||
name
|
||
... on Droid {
|
||
primaryFunction
|
||
}
|
||
... on Human {
|
||
height
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
----
|
||
|
||
```graphql
|
||
{ "ep": "JEDI" }
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"hero": {
|
||
"name": "R2-D2",
|
||
"primaryFunction": "Astromech"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
### 元字段(Meta fields)
|
||
|
||
```graphql
|
||
{
|
||
search(text: "an") {
|
||
__typename
|
||
... on Human {
|
||
name
|
||
}
|
||
... on Droid {
|
||
name
|
||
}
|
||
... on Starship {
|
||
name
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
结果:
|
||
|
||
```json
|
||
{
|
||
"data": {
|
||
"search": [
|
||
{
|
||
"__typename": "Human",
|
||
"name": "Han Solo"
|
||
},
|
||
{
|
||
"__typename": "Human",
|
||
"name": "Leia Organa"
|
||
},
|
||
{
|
||
"__typename": "Starship",
|
||
"name": "TIE Advanced x1"
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
另见
|
||
-------
|
||
|
||
- [GraphQL Schema Language Cheat Sheet](https://github.com/sogko/graphql-schema-language-cheat-sheet) _(github.com)_
|