如何在 Unity 呼叫 GraphQL 的 API?
前言
GraphQL 是 Facebook(現改名為 Meta) 所維護的 API 與資料的查詢語言的開發環境。不同於過往使用 RESTful API 進行資料查詢,需要透過多次的來回,GraphQL 可以更有彈性的查詢資料。所有的資料間有如圖形一般,可以大幅減少 Request 的成本。 在 python 上我們可以透過 graphene1 的函式庫,來作為我們與 GraphQL API 溝通的橋樑。那麼,同樣在 Unity 上我們可以透過 graphQL-client-unity 來與之互動。
在接下來的文章中,我們就會來看如何安裝該套件,並使用期呼叫 GraphQL API。
安裝
在 graphQL-client-unity 的 Github 頁面中,找到名為
UnityPackages的資料夾,並將該資料夾下的.unitypackage檔案下載。開啟 Unity 專案,並將 步驟 1. 下載的
.unitypackage(graphQl-client-unity-v2.unitypackage)匯入安裝相關依賴
3.1 Async Await Support | Integration | Unity Asset Store 2

3.2 JSON .NET For Unity | Input Management | Unity Asset Store 3

在 macOS 上安裝完上述套件後,發現 Unity 仍出現以下錯誤:
PrecompiledAssemblyException: Multiple precompiled assemblies with the same name Newtonsoft. Json.dll included on the current platform. Only one assembly with the same name is allowed ? per platform.由錯誤訊息得知不能同時存在多個
Newtonsoft.Json.dll的檔案。
我們發現Asset/JsonDotNet/Assemblies底下的兩個資料夾Standalone/與Windows/有相同名稱檔案。端看使用者平台,選擇其一留下並將其他刪除即可解決。
使用教學
以下我們以 Pokemon GraphQl 的 API 作為示例,說明如何創建 API reference,並創建及呼叫 graphQL 中的 query, mutation, subscription 等功能。
創立新的 API Reference
在
Assets資料夾中,點擊右鍵選擇Create->GraphQLClient->API Reference新增一份 Scriptable Object為此 Scriptable Object 命名

建立 Query, Mutation, Subscription
三者的加入方式雷同,以下以 Query 作為示例。
Note: 我們需要點擊
Introspect的按鈕來確保與當前 API 的 schema 保持同步
輸入 API 的網址 e.g. https://graphql-pokemon.now.sh/
點擊
Introspect進行同步點擊
Create New Query新增 Query輸入 Query 名稱 e.g. GetAllPokemon
點擊
Create Field新增 query 的欄位透過
Preview Query來對設定進行預覽

呼叫 API
我們可以在 script 中使用上面建立好的 Scriptable Object。
首先我們要在 script 中新增一個
GraphApi的物件接著,將方才建立的 Scriptable Object 於 Inspector 中拉入 script
透過
Post函式呼叫 API回傳值為 UnityWebRequest 的物件,我們可以以下方法得到所需的資料
1string data = request.downloadHandler.text;
回傳值為 JSON 的格式,可以透過 [JsonUtility class] 或第三方的 Json parser 諸如 JSON. Net For Unity 3 來進行處理
動態設定輸入
我們也可以在 script 中動態的改變 query 的欄位。此做法是透過 Query.SetArgs(object input) 來實現。
1public async void CreateNewUser()
2{
3 GraphApi.Query createUser = userApi.GetQueryByName(
4 "CreateNewUser",
5 GraphApi.Query.Type.Mutation);
6 createUser.SetArgs(
7 new{objects = new{id = "idGiven", name = "nameGiven"}});
8
9 UnityWebRequest request = await userApi.Post(createUser);
10}
我們可以建立一個 async 的函式 CreateNewUser 作為創立新使用者的方法。在 line 3 中我們同 Query 時相同,先取得一個 Mutation 形式的 API 服務。接著,line 6 中,我們將 id 與 name 作為欄位進行輸入參數的設定。最後在 line 9 中再透過 Post 送出這個 Mutation 的請求。
小結
在這篇文章中,我們使用了 graphQl-unity-client 的這個插件,來幫助我們在 Unity 上有效的呼叫 graphQl 的 API。我們講解了如何安裝此套件,包含第三方套件的安裝,並排除過程可能會遇到的錯誤。另外,也簡單的介紹了該套件的使用方式,並完成基本的 query, mutation 等的操作。

