初次聽(tīng)聞GraphQL時(shí),我是將其與SQL對(duì)標(biāo)的,腦回路如下:
SQL --> Structured Query Language 結(jié)構(gòu)化查詢語(yǔ)言
GrapqhQL --> Graph Query Language 圖形化查詢語(yǔ)言?
我當(dāng)然錯(cuò)了,GrapqhQL是一種用于 API 的查詢語(yǔ)言,并不是用于查詢數(shù)據(jù)庫(kù)的,事實(shí)上它對(duì)標(biāo)的是RestFul。
這篇博客并不是為了GraphQL的入門(mén)科普,所以詳情請(qǐng)咨詢graphql.cn或者graphql.org。
正所謂"demo is demo"(business is business),哪怕有詳細(xì)的API文檔和豐富的demos(比如graphql-java),對(duì)于類似我這樣的初學(xué)者來(lái)說(shuō),有些地方一旦沒(méi)有點(diǎn)明,是會(huì)有阻塞的。
啪!閑言碎語(yǔ)不要講,單把傳參講一講.
首先假設(shè)一個(gè)本地的graphql server有test.graphqls如下:
schema {
query: Query
}
type Query{
some:[Test]
}
type Test{
a: String!
b: String!
c: String!
}
那么相應(yīng)的origin url 為localhost:8080/graphql?query=query{ some{ a b c } },由于url不允許{}這種特殊符號(hào)的存在,所以實(shí)際訪問(wèn)時(shí)需要進(jìn)行urlencode,當(dāng)然要注意的是只encode"query="之后的部分,實(shí)際訪問(wèn)地址為localhost:8080/graphql?query=query%7B%20some%7B%20a%20b%20c%20%7D%20%7D.
使用querystring即可實(shí)現(xiàn):

傳參實(shí)現(xiàn)
- 修改
grapqhls文件
假如我們要傳入name和time兩個(gè)參數(shù),其中name為必要time為可選,相應(yīng)修改為:
schema {
query: Query
}
type Query{
some(name: String!, time: String):[Test]
}
type Test{
a: String!
b: String!
c: String!
}
-
!表示必傳,同時(shí)會(huì)進(jìn)行Null檢查 - 因?yàn)椴恢С?code>Date和
TimeStamp格式,所以只能使用String或者Long來(lái)傳遞時(shí)間類參數(shù)
2)API URL的調(diào)整
假設(shè)name = ttt, time = 123456789
這部分的調(diào)整實(shí)現(xiàn)有兩種方式,區(qū)別在于是否使用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%7Duse 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時(shí)需要注意:
<1> 使用$來(lái)定義變量,類似于placeholder的作用,沒(méi)有它的聲明,variables是解析不出變量的
<2> &不可以被煉化,哦不,不可以被urlencode,即query和variables兩部分要分別進(jìn)行urlencode,否則variables解析會(huì)失常
以上對(duì)比明顯可以看到,使用variables時(shí)API更復(fù)雜,那么這樣圖啥?
主要是variables解析結(jié)果不同,直接上實(shí)操圖吧,這是基于graphql-java-examples二三四次修改開(kāi)發(fā)的,圖中是兩種傳參方式的解析結(jié)果對(duì)比:

關(guān)于傳參更準(zhǔn)確的解釋還是參考官方文檔passing-arguments。
折騰兩三回之后再回頭去看文檔,發(fā)現(xiàn)自己明白了更多,從0開(kāi)始的時(shí)候,明明白白地寫(xiě)在眼前也是有可能被忽略的。
其實(shí)最好玩的是graphiql:
