graphql临时的学习记录,还没有来得及整理

80 阅读3分钟

1,安装brew在国内

zhuanlan.zhihu.com/p/404417025 配置国内brew的源的方式

brew命令就有点像python的pip,vue的nom,yaml都需要一个代理,不能直接访问国外的网址,太慢或被防火墙挡了。

他们说用阿里的代理比较好,我用的好像是中科大的,下面是阿里的

# 查看 brew.git 当前源
$ cd "$(brew --repo)" && git remote -v
origin   https://github.com/Homebrew/brew.git (fetch)
origin   https://github.com/Homebrew/brew.git (push)
​
# 查看 homebrew-core.git 当前源
$ cd "$(brew --repo homebrew/core)" && git remote -v
origin   https://github.com/Homebrew/homebrew-core.git (fetch)
origin   https://github.com/Homebrew/homebrew-core.git (push)
​
# 修改 brew.git 为阿里源
$ git -C "$(brew --repo)" remote set-url origin https://mirrors.aliyun.com/homebrew/brew.git# 修改 homebrew-core.git 为阿里源
$ git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.aliyun.com/homebrew/homebrew-core.git# zsh 替换 brew bintray 镜像
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.zshrc
$ source ~/.zshrc# bash 替换 brew bintray 镜像
$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.aliyun.com/homebrew/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile# 刷新源
$ brew update

相关的安装命令:

brew install --cask graphql-playground

2,相关的代码说明

开始使用GraphQL Java和Spring Boot juejin.cn/post/684490…

3,post请求中的语法

这个参数确实不是很友好,graphql没有推行好可能也是这个原因。

image.png

image.png

4,graphql的语法

juejin.cn/post/684490…

4.1,总体说明

查询的标准

选择集(selection set) 是一个会在GraphQL 文档中经常出现的概念,它赋予了GraphQL递归的特性,允许你获取嵌套形式的数据。

image.png

4.2, 参数说明

juejin.cn/post/698208…

这里介绍了参数如何定义query(在这里定义变量如id$:ID) 注意:后面的ID是指类型,不是变量,就是唯一不重复的意思,是不是也可以改为Int的?居然不行。是否因为我们的type中定义的就是ID的?

image.png

改为int试试,果然就正常了

image.png

image.png

4.3,我用了参数后为什么没有结果显示出来的?哪里有问题的?

image.png

搞错了,将参数输入了到头上去了,所以id一直没有值,改完后就正常了,如下

image.png

4.4,graphql自带的类型

ID: 就类似传统数据库中的ID 字段,主要用于区别不同的对象。可以直接是一个Int, 也可能是一个编码过的唯一值,比如常见的relay 中使用的是“类名:ID” 的字符串再经base64 转码后的结果作为ID. 要注意的是这个ID 只是存在于Graphql 中的。它不一定和数据库中的是对应的。比如relay 这个情况,数据库中存的可能还是一个整数并不是那个字符串。

Int: 整数,可正负。

Float: 双精度浮点数,可正负。

String: UTF-8 字符的字符串。

Boolean: true / false.

Graphql 中支持枚举类型,可以这样定义:

enum GenderTypes {
MALE
FEMALE
OTHERS
}

4.5,自定义类型

定义一个类型的Graphql 写法很简单,比如我们新增一个Date 类型。

scalar Date

4.6 接口(Interface) 和联合类型(Union)

nterface 和其他语言的类似,都是为了给一个通用的父类型定义用的,注意这里接口中的字段在实际的实体上面还是需要重新再写的,不能说不写的

interface Animal {
id: ID!
name: String
}
​
type Dog implements Animal {
id: ID!
name: String
breed: String
}
​
type Cat implements Animal {
id: ID!
name: String
color: String
}

但查询的语句你要这样写

query 
{Aniaml
{id
  name
  .. on Dog{
  breed
  }
}
}

Union 可以直接理解成是没有共同字段的Interface 写法与interface一样。

4.7输入类型 Input types

如果入参是一个对象,则可以用Input types,用法如下

type Mutaion {
createSomething(foo: Int, bar: Float): Something
}

等同于

input CreateSomethingInput {
foo: Int
bar: Float
}
​
type Mutaion {
createSomething(input: CreateSomethingInput): Something
}
​

4.8 graphql的官方文档

graphql.org/learn/queri…

这里也有参数的说明

4.9 读下这段代码

public DataFetcher getBookByIdDataFetcher() {
   // 找到指定id的书
   return dataFetchingEnvironment -> {
       String bookId = dataFetchingEnvironment.getArgument("id");
       return books
              .stream()
              .filter(book -> book.get("id").equals(bookId))
              .findFirst()
              .orElse(null);
  };
}
​
public DataFetcher getAuthorDataFetcher() {
   // 找到指定作者ID的人
   return dataFetchingEnvironment -> {
       Map<String,String> book = dataFetchingEnvironment.getSource();
       String authorId = book.get("authorId");
       return authors
              .stream()
              .filter(author -> author.get("id").equals(authorId))
               // 这里的id不是指那个大的入参,而是因为这个实体也有一id字段
              .findFirst()
              .orElse(null);
  };
}

这里有一个问题,不同文件中的graphql中的实体是否可以共用的?可以改为两个文件试试。

resouce这个类是不是可以同时加载两个文件的?

getAuthorDataFetcher是不是可以设置增加参数的获取的?