初次听闻GraphQL时,我是将其与SQL对标的,脑回路如下:
SQL --> Structured Query Language 结构化查询语言
GrapqhQL --> Graph Query Language 图形化查询语言?
我当然错了,GrapqhQL是一种用于 API 的查询语言,并不是用于查询数据库的,事实上它对标的是RestFul。
这篇博客并不是为了GraphQL的入门科普,所以详情请咨询graphql.cn或者graphql.org。
正所谓"demo is demo"(business is business),哪怕有详细的API文档和丰富的demos(比如graphql-java),对于类似我这样的初学者来说,有些地方一旦没有点明,是会有阻塞的。
啪!闲言碎语不要讲,单把传参讲一讲.
首先假设一个本地的graphql server有test.graphqls
如下:
schema {
query: Query
}
type Query{
some:[Test]
}
type Test{
a: String!
b: String!
c: String!
}
那么相应的origin url 为localhost:8080/graphql?query=query{ some{ a b c } }
,由于url不允许{}
这种特殊符号的存在,所以实际访问时需要进行urlencode
,当然要注意的是只encode
"query="之后的部分,实际访问地址为localhost:8080/graphql?query=query%7B%20some%7B%20a%20b%20c%20%7D%20%7D
.
使用querystring即可实现:

传参实现
- 修改
grapqhls
文件
假如我们要传入name
和time
两个参数,其中name
为必要time
为可选,相应修改为:
schema {
query: Query
}
type Query{
some(name: String!, time: String):[Test]
}
type Test{
a: String!
b: String!
c: String!
}
-
!
表示必传,同时会进行Null
检查 - 因为不支持
Date
和TimeStamp
格式,所以只能使用String
或者Long
来传递时间类参数
2)API URL的调整
假设name = ttt, time = 123456789
这部分的调整实现有两种方式,区别在于是否使用variables
:
-
no variables
origin url:localhost:8080/graphql?query=query{ some(name: "ttt", time: "123456789"){ a b c } }
encoded url:localhost:8080/graphql?query=query%7B%20some(name%3A%20%22ttt%22%2C%20time%3A%20%22123456789%22)%7B%20a%20b%20c%20%7D%20%7D
-
use variables
origin url:localhost:8080/graphql?query=query($name: String!, $time: String){ some(name: $name, time: $time){ a b c } }&variables={"name": "ttt", "time": "123456789"}
encoded url:localhost:8080/graphql?query=query(%24name%3A%20String!%2C%20%24time%3A%20String)%7B%20some(name%3A%20%24name%2C%20time%3A%20%24time)%7B%20a%20b%20c%20%7D%20%7D&variables=%7B%22name%22%3A%20%22ttt%22%2C%20%22time%22%3A%20%22123456789%22%7D
使用variables
时需要注意:
<1> 使用$
来定义变量,类似于placeholder
的作用,没有它的声明,variables
是解析不出变量的
<2> &
不可以被炼化,哦不,不可以被urlencode
,即query
和variables
两部分要分别进行urlencode
,否则variables
解析会失常
以上对比明显可以看到,使用variables
时API更复杂,那么这样图啥?
主要是variables
解析结果不同,直接上实操图吧,这是基于graphql-java-examples二三四次修改开发的,图中是两种传参方式的解析结果对比:

关于传参更准确的解释还是参考官方文档passing-arguments。
折腾两三回之后再回头去看文档,发现自己明白了更多,从0开始的时候,明明白白地写在眼前也是有可能被忽略的。
其实最好玩的是graphiql
:

网友评论