GraphQL - Matters API為例 (use python GQL)

bigN
·
(修改过)
·
IPFS
·
沒用過GraphQL,只聽說是前端拿資料很方便,後端寫起來很麻煩的設計風格。剛好這次發現Matters用的就是GraphQL,而且還開源出來,還不來練習一波RRR~~但避免平常沒用,馬上就忘記GraphQL怎麼用(金魚腦4我),順便筆記一下。

參考自@robertu 的​​社區開放一小步:Matters API

大概筆記
1 我可以在哪試打api?
2 輸入格式怎麼打
3 文件怎麼看
4 喔有資料了然後咧 (Python - GQL)

  (1) token打在哪
  (2) input怎麼設為變數

1 我可以在哪試打api?

2個方法:

(1) postman(https://www.postman.com) 需要註冊,如果只是試用一下,建議用方法(2) playground

參考至postman的官方文件(https://learning.postman.com/docs/sending-requests/supported-api-frameworks/graphql/),現在是有支援GraphQL的哦

圖片來源自postman官方文件

(2)playground 不需要註冊,不用載任何東西,有夠方便,真是好東西耶QQ

playground連結附上:

https://server.matters.news/playground

2 輸入格式怎麼打

不管是query,還是mutation,基本格式都是這樣

query {
    SOME_SCRIPT  
}

mutation {
    SOME_SCRIPT
}

直接來個實例

query {
  user(input: { userName: "INPUT_USER_NAME" }) {
      displayName
  }
}

他的輸入格式應該是這樣的

query {
  SOME_API_NAME(INPUT_PARA: { KEY1: VALUE1, KEY2: VALUE2 }) {
      SOME_VALUE_YOU_WANT
      SOME_VALUE_YOU_WANT {
           SOME_SUB_VALUE
           SOME_SUB_VALUE
      }
   }
}

3 文件怎麼看

好哦,所以學會格式了,那我怎麼知道我要輸入什麼,我又可以拿到什麼輸出?

(1) 點選playground右邊的doc (有夠精美),可以看到api應該是用query或是mutation去取得

(2) 以user為例,可以得知api的名稱是user(紅字),並且他的型別是User (黃字)

(3) 發現要打user這支api,是有input的,並且型別是UserInput

(4) 滑鼠滾輪到底的過程中,中間這些值,通通都是我可以取得的值

(5) 找到input要輸入的格式是UserInput,點選進去後

(6) 發現格式就是打一個key叫做userName,並且value是一個字串

好了,從以上6個順序,就可以湊出第2步的實例的打法了,有興趣可以多玩玩,打錯他還會提示你,揪肝心,根本天使QQQQQ

4 喔有資料了然後咧 (Python - GQL)

以上的步驟,學到了怎麼取得資料,不過取得資料之後應該是要做某些處理的,不然上述的步驟,只是在確認這些api沒壞掉,可以用而已

以下使用python的GQL(https://github.com/graphql-python/gql)套件為例,他的Github已經有附使用例子了,所以這邊我只大概記錄一下實際我用到的功能

  (1) token打在哪

transport = AIOHTTPTransport(url="https://server.matters.news/graphql",
                 headers={"x-access-token": "YOUR_TOKEN"})
client = Client(transport=transport,
                fetch_schema_from_transport=True)

 (2) gql的input怎麼設為變數

一樣以user為例,原本打在playground的內容是

query {
  user(input: { userName: "USER_NAME" }) {
      displayName
  }
}

直接把script貼進GQL內,程式碼如下

query = gql(
        """
        query{ 
          user(input: { userName: "USER_NAME" }) {
            displayName
            }
        }
        """
)

但現在,userName我不想寫死,想設為變數,那就改這樣

userName = "USER_NAME"
paras = {"userName": userName}
query = gql(
      """
        query ($userName: String!){ 
          user(input: { userName: $userName }) {
            displayName
            }
        }
        """
  )
result = client.execute(query, variable_values=paras)

大致上就是多設個參數,並在query後面,先加上多了哪些變數,並且變數的型別是什麼

結論

最近剛好發生兩件事,一個是@志工爺爺白菩提花名冊 2021-0709 ( 本日頭條 : 盜文事件 ),另一個是則是@catdingMatters儀表板發佈,每日自動更新,剛好可以跟到什麼叫做水能載舟,亦能覆舟,平平都是開放API,就有人拿來盜文(對,依照DOC的內容,只要你想,現在也可以練習盜一波XDD),但也有人把資料來拿視覺化,讓大家更可以瞭解平臺的活躍度,以及大家可能喜歡的話題,欸,大概學習到了對於開源專案的一些正確使用方式了啊3口3!!

CC BY-NC-ND 2.0 授权

喜欢我的作品吗?别忘了给予支持与赞赏,让我知道在创作的路上有你陪伴,一起延续这份热忱!