(原創(chuàng))GraphQL API的參數(shù)怎么傳?

初次聽(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):

1.png

傳參實(shí)現(xiàn)

  1. 修改grapqhls文件
    假如我們要傳入nametime兩個(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%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時(shí)需要注意:
<1> 使用$來(lái)定義變量,類似于placeholder的作用,沒(méi)有它的聲明,variables是解析不出變量的
<2> &不可以被煉化,哦不,不可以被urlencode,即queryvariables兩部分要分別進(jìn)行urlencode,否則variables解析會(huì)失常

以上對(duì)比明顯可以看到,使用variables時(shí)API更復(fù)雜,那么這樣圖啥?
主要是variables解析結(jié)果不同,直接上實(shí)操圖吧,這是基于graphql-java-examples二三四次修改開(kāi)發(fā)的,圖中是兩種傳參方式的解析結(jié)果對(duì)比:

2.png

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

其實(shí)最好玩的是graphiql:

3.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容