GraphQL是一個強大的API設計工具,並提供了一些優於傳統REST API的優勢。但是GraphQL存在抓取不足或過度抓取
我們需要意識到下面認知陷阱,進而改變使用GraphQL方式,才能避免誤用GraphQL導致的各種問題:
- 不是SELECT * 等效項:GraphQL中欄位只允許客戶端精確指定他們需要的資料,避免過度提取和不足提取。這與REST形成對比,REST中的端點通常返回固定的資料結構。也就是說,REST返回的是固定資料結構,如果你覺得不夠用,多呼叫幾次REST,將多個資料結構拼湊在一起符合自己需要,就像組合SQL的select查詢一樣,需要多個不同select查詢才能獲得我們要的資料結構,而GraphQL不是這樣,一次就獲得你要的,強調精確,因為它是一個資料聚合概念,類似DDD中聚合根
- 不是一個需求一個端點:在REST中,每個需求都可能需要一個新的端點,而GraphQL則是透過一個API介面滿足各種需求。這減少了建立、管理和版本化多個端點的需要。
- 無動詞:GraphQL使用JavaScript來獲取資料,使用可變項來更改資料,與使用多個動詞(GET,POST,PUT,POST,PATCH)的REST相比,它簡化了互動模型。如訂單是一個GraphQL,訂單狀態是可變的,但是其他不變,區分可變部分和不變部分。
- 200 OK並不意味著一切都很好:在GraphQL中,即使存在執行錯誤,也會為所有語法正確的查詢和變化返回200 OK狀態。錯誤必須被捕獲在響應中的錯誤陣列中,提供關於錯誤的詳細資訊。而 REST API 中,每個端點都可以根據結果返回不同的 HTTP 狀態程式碼。
- 強大的查詢能力,強大的責任:GraphQL的靈活性允許高度特定的資料請求,但編寫不好的查詢或解析器可能會導致效能問題。高效的解析器設計對於防止效能瓶頸和確保最佳API效能至關重要。
總的來說,GraphQL促進了智慧資料獲取和API設計,允許在不中斷現有客戶端的情況下進行增量更改。
這不僅是智慧資料獲取,也是智慧應用程式介面設計。