Spring for GraphQL 1.0 里程碑 6 釋出

工程 | Rossen Stoyanchev | 2022 年 3 月 22 日 | ...

我代表所有參與者,很高興宣佈 Spring for GraphQL 1.0 版本的第六個也是最後一個里程碑版本現已可用。我們的下一站是 4 周後的 RC1,隨後是 5 月 17 日的 GA 版本。

GraphQL 客戶端

GraphQL 客戶端是我們很早就確定為目標的東西。目前在問題跟蹤器中,它是 336 個問題中的第 10 個,但我們認為測試支援是更高優先順序,因此 GraphQL 測試器優先推出,並且從一開始就可用。

測試器確實被證明有價值且受歡迎,但我們知道在 1.0 之前必須充分探索客戶端,因為兩者密切相關但視角略有不同,並且我們希望確保它們彼此對齊。

第二點是測試器支援伺服器端的訂閱測試,但不支援透過 WebSocket 進行測試。這一點非常重要,需要探索,因為與 HTTP 中一個 GraphQL 請求對應一個 HTTP 請求不同,在 WebSocket 中,許多 GraphQL 請求共享同一個連線,這是一種根本不同的操作模式。例如,WebSocket 傳輸在發出請求時需要透明地連線,確保一個單一的共享連線,管理其生命週期,並且作為一個長連線,提供啟動和停止的控制。

我很高興地宣佈,里程碑 6 版本包含了一個 GraphQL 客戶端。它支援透過 HTTP 進行單響應請求(查詢和變更),以及透過 WebSocket 進行訂閱以及查詢和變更。

一些使用示例

String document = "{" +
        "  project(slug:\"spring-framework\") {" +
        "   name" +
        "   releases {" +
        "     version" +
        "   }"+
        "  }" +
        "}";

Mono<Project> projectMono = graphQlClient.document(document)
        .retrieve("project")
        .toEntity(Project.class);

響應資料被解碼為 Project。請求文件也可以儲存在檔案中,並透過簡單的名稱(例如 "project")引用,或者您可以透過程式碼生成的請求建立它,例如來自 Netflix DGSGraphQLQueryRequest

訂閱的一些使用示例

Flux<String> projectFlux = client.document("subscription { projects { name } }")
        .retrieveSubscription("projects")
        .toEntity(Project.class);

還有更多內容待發現。請參閱參考文件中新的 客戶端章節

GraphQL 測試器

GraphQL 測試器已更新以與新客戶端對齊。兩者共享 GraphQL 傳輸的底層契約,因此測試器現在也支援 WebSocket。

部分 API 已經發生了變化,部分是為了與客戶端對齊,但也有其他原因,例如使用正確的術語並避免 query 的過載使用等等。請參閱 此問題及相關連結獲取更多詳情。

一個值得注意的 API 更改是使用了專用型別來表示 GraphQL 錯誤,該型別還透過以 "." 分隔的字串(例如 "project.name")暴露錯誤路徑,這使得透過字串比較檢查預期的欄位錯誤變得相當容易。

對於檢查給定 JSON 路徑上的響應資料的選擇也已縮小範圍,以便提供更多指導並專注於重要內容。這些包括欄位的 hasValue, isNulldoesNotExist,此外還可以選擇解碼為更高級別的物件以進行進一步斷言。

Spring Security

Spring Security 使用者會熟悉 @AuthenticationPincipal 註解,現在您可以在資料控制器中 @SchemaMapping 方法的方法引數上使用它。這提供了對 Spring Security 認證中的 Principal 的訪問。

引數繫結

到目前為止,您已經能夠使用 @Argument 將特定引數繫結到您選擇的物件上。現在您可以使用 @Arguments 將完整的引數對映繫結到物件上。

GraphQL 引數可以是具有巢狀物件或巢狀物件列表的複雜輸入型別。引數繫結功能支援將其對映到匹配的 Java 物件結構,包括建構函式和屬性初始化以及標量值的型別轉換。這使得處理可能發生在任何級別的轉換和其他初始化錯誤成為一個挑戰。

現在,引數繫結會丟擲包含所有累積錯誤的 BindException。繫結演算法現在遇到第一個錯誤時不會放棄,而是繼續累積儘可能多的錯誤。每個錯誤都包含一個 field 屬性,該屬性是一個以 "." 分隔的路徑,指向發生錯誤的引數位置。

API 變更

本次釋出包含了大量的 API 變更。在大多數情況下,這些變更應該很容易處理,並且不會很困難。其中大部分是為了引入客戶端,以確保客戶端和伺服器之間的對稱性和一致性命名而推動的。

預計這將是最後一次此類主要的變更輪次。RC1 版本在向後相容性變更方面應該會相當穩定,並且此後的 API 也將保持穩定。

Boot Starter

現在位於 Spring Boot 本身的 Spring for GraphQL Boot starter 已經跟進了所有的變更。最新的 Spring Boot 2.7 快照是最新的,並且 2.7 M3 版本定於本週四釋出。

社群

最後但同樣重要的是,感謝在 Spring for GraphQL 問題跟蹤器中持續提供反饋和討論。我們非常感謝這些意見,它們讓專案變得更強大、更好!

訂閱 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

超越他人

VMware 提供培訓和認證,助您加速發展。

瞭解更多

獲得支援

Tanzu Spring 透過簡單的單一訂閱提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將到來的活動

檢視 Spring 社群中所有即將到來的活動。

檢視全部