GraphQL 與 RESTful API 應用的場景與分析

閱讀時間約 7 分鐘
網路上已經有很多相關這兩者的討論,單純的討論兩者的理念我認為還是很難決定要在哪些場景使用,因此這裡會針對實現這兩者介面所需要做的事情來比較這裡會先略過 權限驗證、流量限制、快取、遞迴查詢… 等等 GraphQL 常常被提及的問題,這些可以透過使用 GraphQL 生態系中的工具 如 Hasura、Prisma 來處理
GraphQL 與 RESTful API 差異介紹文章

以後端來看,如何實現 GraphQL 與 RESTful API

GraphQL
透過實現一組 Post 端點對外,並且由 schema 與 resolvers 這兩個元件所組成
  • schema 決定了數據的長相
  • resolvers 決定了處理需求的方式
因此當我們開發一個 Order 的 GraphQL API 時,我們會需要
1. 定義 Order 表的 schema
2. 撰寫針對 Order 表行為的 resolvers,Queries and Mutations (Execution | GraphQL)
3. 透過 GraphQL 生態系提供的監測工具與跟前端溝通,針對常下的查詢條件對資料庫進行 Index 的建立與快取優化
這樣當前端使用到 Order 這個 schema 時就可以透過我們自定義的 resolvers 來執行相對應的行為,且能僅拿需要的欄位來避免過度撈取
如果需要複數的 schema 資料,僅需在發送請求時要求聚合的 schema 即可
RESTful API
透過多組 API 端口並用各種 HTTP request methods 來實現服務,基本上由 dto 與 logic 這兩個元件所組成
  • dto 全稱為 數據傳輸對象 (Data transfer object),為與前端溝通時的結構
  • logic 這裡指的是後端業務邏輯,針對每一組 API 來設計不同的業務流程
因此當我們開發一個 Order 的 RESTful API 時,我們會需要
1. 定義 Order API 的增刪修查用的 dto
2. 設計增刪用的 API 端點
增 (post) /order
刪 (delete) /order
修 (put) /order
查全部 (get) /order
查特定 id (get) /order/{id}
3. 針對不同 HTTP request methods 的端點撰寫業務邏輯
4. 針對設計上規範的查詢條件優化資料庫的 Index 與快取
這樣當前端需要針對 Order 這個資源操作時,就可以選擇相對應的 API 端點來做操作
如果需要複數的資源的資料,如 Order 與 Product ,會有兩種方案
1. 前端呼叫兩隻 API 來取得資料並在前端拼裝資料,而此缺點會有取得不必要欄位與多次請求造成的效能損耗
2. 後端再定義一組新的 dto 與 logic 來針對新的資源做查詢,如 OrderInfo,可以針對目前需要的欄位進行設計,但針對性強所以不一定能有效複用

以前端來看,如何對接 GraphQL 與 RESTful API

GraphQL
統一的資源取得 Url,且限定使用 Post,基本上可以透過套件來簡化這樣的連接行為,僅需要關注在組合 schema 來取得需要的欄位資料
當我們開發一個 Order 的 GraphQL API 頁面時,我們會需要
1. 取得 GraphQL Server 定義的 schema 與 mutations列表
2. 選擇 Order 的 schema 來做請求
3. 對著 GraphQL Url 發送 Order schema 並選擇需要的欄位與需要用的 Queries 或 Mutation
4. 依據 GraphQL 的語言約定,來進行操作
5. 獲取資料並呈現
RESTful API
每一個資源對應到不同的 API Url,針對想要做的 CRUD 動作選擇對應的 HTTP request methods 進行呼叫
因此當我們開發一個 Order 的 RESTful API 頁面時,我們會需要
1. 取得 RESTful API 定義的 API 列表,可以透過 swagger 或後端提供的文件
2. 針對不同頁面選擇合適的 Order API
3. 依據前後端約定的 API 格式與互動方法來進行交互,如資源定義的結構與分頁指定的 Index …等
4. 獲取資料並呈現

結論

GraphQL 定義了一個前後端實現交互的約定規範,也給予了前端很大程度取得資料的彈性
適合 C 端產品,多變化的功能需求與跨平台可能性(web、mobile)與高度的效能要求,給予前端獲取資料的彈性呈現畫面
RESTful API 僅針對了風格與建議使用 HTTP request methods 來作行為的標註,較多邏輯與欄位的呈現是控制在後端,導致了每一個 API 的功能的專一性會較強,如共通使用會有多餘的欄位或多次訪問造成 API 較慢的呈現時間
適合 B端產品,欄位與行為上由後端控制的做法不見得不好,多數儀表板應用應用較常使用這樣的方式來實作,也可以降低前端獲取資料的複雜度與降低資料庫優化的難度
但不論是用 GraphQL 還是 RESTful API,都需要前後端釐清業務場景來設計 DB Schema 與快取優化,而不是用了 GraphQL 或是 RESTful API 就可以把所有問題丟給前端或後端,亦不是 GraphQL 就可以取代 RESTful API,還是要看團隊配合與產品特性而定

參考資料

Queries and Mutations (Execution | GraphQL)
分享網站開發的前端、後端、資料庫與部屬維運技術,並記錄在工作上的心得
留言0
查看全部
發表第一個留言支持創作者!
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
MongoDB 在排序時會將資料全部載入記憶體,之後在記憶體中進行排序,而預設開放給排序的記憶體只有 32 MB,因此在大量資料排序時就會引發該錯誤。
fast endpoints 是一個支援 .NET 6 以上(Nuget 版本清單) 的 API 輕量框架,雖以簡單與高性能為主打,但也提供了很多常用的功能實現,如 Swagger 整合、Jwt 認證、Api 版本控制、APi 速率限制、Api 回應快取…很適合以此為基礎打造 Api 服務。
MongoDB 在排序時會將資料全部載入記憶體,之後在記憶體中進行排序,而預設開放給排序的記憶體只有 32 MB,因此在大量資料排序時就會引發該錯誤。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
〔綸語005〕20240611 嗨,這禮拜玩得開心嗎? 端午三天連假,我的行程超級滿啊! 第一天,我到台中參加哲維的影響力社交工作坊,你可能會想身為一個心理師,應該很擅長人際關係了,為什麼還要去上類似的課程呢? 原因有二:第一,我擅長的是情感關係中的人際互動,關注的是經營朋友或親密關係,與哲
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
Thumbnail
🚀 在Gin中整合GraphQL和MongoDB:靈活的數據查詢 隨著Web應用的複雜度增加,開發者尋找更靈活和高效的方式來查詢和操作數據。GraphQL作為一種查詢語言,允許用戶精確地指定他們想要的數據,而MongoDB作為一個靈活的NoSQL數據庫,可以很好地支持這種查詢。結合這兩者,我
Thumbnail
實時數據更新在今天的應用程序中變得越來越重要。GraphQL訂閱提供了一種高效的方式來實現這一目標。 在這篇文章裡,我們將探討如何在Gin框架與GraphQL結合下,實現數據的實時更新,或者說,實現所謂的“訂閱”功能。
Thumbnail
隨著Web應用的發展,前端和後端的需求也在變得越來越複雜。RESTful APIs已經不再滿足當前的需求,而GraphQL作為一個新興的數據查詢語言,提供了更靈活的查詢能力。在這篇文章中,我們將探討如何在Gin中實現GraphQL API,為你的應用帶來現代化的數據查詢。
Thumbnail
#今天讓我說,我們共同的生命故事。 與澄公相處近三個月了,澄公脊椎有些微駝峰的傾向,在與家屬書寫交流後,才得知澄公有多發性脊髓瘤。 起初的我想藉由肌力訓練,讓澄公行走能力有所進步,但八十近九十歲的高齡與特殊病症,讓我從新思考照護澄公的方式。 澄公的家屬,是我從事居服中,感覺最用心思的子女,不管是在
Thumbnail
本書作者--多明尼克•斯賓斯特(Dominik Spenst),在柬埔寨的一次嚴重車禍幾乎失去左腿,經過12次手術,在這次的意外中,讓作者停止把精力放在「希望事情會有所不同」,和期待下一個「如果」的發生,徹底改變他的人生態度,自此之後專注在人生中的好事,並開始每天寫下來,學會真心的珍惜與感恩。
Thumbnail
最近電影「薩滿」中,片中的神明附身相信讓不少觀眾都聯想到了台灣的民俗醫療中很重要的角色-「乩童」,而筆者在大約十多年前因為選修一門名叫《醫療人類學》的課,有幸能夠與北部兩間宮廟的乩童、善男信女進行關於民俗醫療與附身行為之訪談,於此和大家分享當時之訪談資料。
Thumbnail
最親愛的毛小孩離世了。當下震驚不已也不之該作何回覆,即使面臨了再多生離死別,依然會在有類似事件發生在自己親友身上時震撼且無措。
Thumbnail
讓家的狀態時時跟上自己的內在 曾經去幫一位朋友搬家 他的家是租來的套房 裡面空間很小 乍看之下也以為東西並不多 但臨時決定要搬家 因此當天開始急忙收拾 當真正的把櫥櫃都打開時 我才真正的驚了 滿滿的物品滿滿的衣服 每個能塞的地方 床板下 陽台的儲物空間 裡面全是滿的 他完全沒有任何的選擇與淘汰
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
Thumbnail
〔綸語005〕20240611 嗨,這禮拜玩得開心嗎? 端午三天連假,我的行程超級滿啊! 第一天,我到台中參加哲維的影響力社交工作坊,你可能會想身為一個心理師,應該很擅長人際關係了,為什麼還要去上類似的課程呢? 原因有二:第一,我擅長的是情感關係中的人際互動,關注的是經營朋友或親密關係,與哲
Thumbnail
透過GraphQL提供的分頁方式,優化後端讀取資料的效能,避免過度讀取舊資料及準確指定特定項目。同時,利用Local-only field達成資料的整理或再次經過計算,提升管理和重複使用的效能。
Thumbnail
🚀 在Gin中整合GraphQL和MongoDB:靈活的數據查詢 隨著Web應用的複雜度增加,開發者尋找更靈活和高效的方式來查詢和操作數據。GraphQL作為一種查詢語言,允許用戶精確地指定他們想要的數據,而MongoDB作為一個靈活的NoSQL數據庫,可以很好地支持這種查詢。結合這兩者,我
Thumbnail
實時數據更新在今天的應用程序中變得越來越重要。GraphQL訂閱提供了一種高效的方式來實現這一目標。 在這篇文章裡,我們將探討如何在Gin框架與GraphQL結合下,實現數據的實時更新,或者說,實現所謂的“訂閱”功能。
Thumbnail
隨著Web應用的發展,前端和後端的需求也在變得越來越複雜。RESTful APIs已經不再滿足當前的需求,而GraphQL作為一個新興的數據查詢語言,提供了更靈活的查詢能力。在這篇文章中,我們將探討如何在Gin中實現GraphQL API,為你的應用帶來現代化的數據查詢。
Thumbnail
#今天讓我說,我們共同的生命故事。 與澄公相處近三個月了,澄公脊椎有些微駝峰的傾向,在與家屬書寫交流後,才得知澄公有多發性脊髓瘤。 起初的我想藉由肌力訓練,讓澄公行走能力有所進步,但八十近九十歲的高齡與特殊病症,讓我從新思考照護澄公的方式。 澄公的家屬,是我從事居服中,感覺最用心思的子女,不管是在
Thumbnail
本書作者--多明尼克•斯賓斯特(Dominik Spenst),在柬埔寨的一次嚴重車禍幾乎失去左腿,經過12次手術,在這次的意外中,讓作者停止把精力放在「希望事情會有所不同」,和期待下一個「如果」的發生,徹底改變他的人生態度,自此之後專注在人生中的好事,並開始每天寫下來,學會真心的珍惜與感恩。
Thumbnail
最近電影「薩滿」中,片中的神明附身相信讓不少觀眾都聯想到了台灣的民俗醫療中很重要的角色-「乩童」,而筆者在大約十多年前因為選修一門名叫《醫療人類學》的課,有幸能夠與北部兩間宮廟的乩童、善男信女進行關於民俗醫療與附身行為之訪談,於此和大家分享當時之訪談資料。
Thumbnail
最親愛的毛小孩離世了。當下震驚不已也不之該作何回覆,即使面臨了再多生離死別,依然會在有類似事件發生在自己親友身上時震撼且無措。
Thumbnail
讓家的狀態時時跟上自己的內在 曾經去幫一位朋友搬家 他的家是租來的套房 裡面空間很小 乍看之下也以為東西並不多 但臨時決定要搬家 因此當天開始急忙收拾 當真正的把櫥櫃都打開時 我才真正的驚了 滿滿的物品滿滿的衣服 每個能塞的地方 床板下 陽台的儲物空間 裡面全是滿的 他完全沒有任何的選擇與淘汰