
2024 年如何實(shí)施 API 策略?
findPost(id: <postId>) {
id
title
content
author
comments {
id
comment
commentedBy
}
}
}
正如你所看到的,我們僅僅通過單個(gè)請求獲取到了所有必要的數(shù)據(jù)。 所以當(dāng)你想要一個(gè)新字段你只需要將它添加進(jìn)查詢中,它將在響應(yīng)中呈現(xiàn)
2、強(qiáng)類型
GraphQL 被強(qiáng)類型模式所控制。這些類型既可以是原始的也可以是派生的。強(qiáng)類型系統(tǒng)允許 API 自文檔化,從而使客戶端知道在查詢特定查詢時(shí)會(huì)的到什么響應(yīng)。
3、客戶端驅(qū)動(dòng)
GraphQL 提供了一種聲明式語法,以便客戶端精確地指定它們所需的字段。 這消除了由于客戶端根據(jù)模式向 GraphQL 服務(wù)器聲明其數(shù)據(jù)需求而導(dǎo)致數(shù)據(jù)冗余和不充分的可能性。
4、API 演變
因?yàn)樵?GraphQL 中一切都是模式(schema)驅(qū)動(dòng),新增字段不會(huì)影響現(xiàn)存字段,而且 GraphQL 還為廢棄字段提供 @deprecated 注釋,所以對 GraphQL 的擴(kuò)展并不是問題。 這就消除了 API 版本控制的需要。
5、傳輸層不可知
這是 GraphQL 的一個(gè)非常棒的優(yōu)點(diǎn)。 API 服務(wù)器可以通過類似 HTTP, HTTPS, WebSockets, TCP, UDP 等協(xié)議進(jìn)行信息交換。 這是因?yàn)?GraphQL 甚少關(guān)心信息如何在客戶端與服務(wù)器之間進(jìn)行交換。
哇,GraphQL 很棒,這是一個(gè)眾所周知的事實(shí)。但是世界上的任何東西都是有缺陷的,GraphQL 也無法置身事外。
1、緩存功能不成熟
GraphQL 不支持瀏覽器和移動(dòng)手機(jī)緩存,這一點(diǎn)區(qū)別于使用本地 HTTP 緩存機(jī)制的 RESTful 服務(wù),因此我們要為實(shí)現(xiàn) GraphQL 緩存付出額外努力。雖然有 Relay 這樣的工具提供了一些緩存支持,但是它們還沒有 RESTful 服務(wù)使用的緩存機(jī)制成熟。
2、檢驗(yàn)與錯(cuò)誤報(bào)告
RESTful 服務(wù)利用 HTTP 狀態(tài)代碼來處理可能遇到的不同錯(cuò)誤。對開發(fā)人員來說,這使得 APIs 的檢驗(yàn)變得非常簡單和輕松。但是使用 GraphQL 服務(wù)總是返回 200 OK 響應(yīng)。一個(gè)典型的 GraphQL 錯(cuò)誤消息是這樣的,狀態(tài)碼為 200 OK 。
{
errors: [
{
message: 'Some error occurred'
}
]
}
這使得處理錯(cuò)誤場景非常困難,并且使得檢驗(yàn)過程非常麻煩。
3、暴露模式和資源攻擊
和 RESTful 服務(wù)不同,GraphQL 服務(wù)要求客戶端必須知道要查詢的數(shù)據(jù)模式。 如果您將 API 暴露給第三方,則基本上暴露了您的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。必須非常小心,因?yàn)榭蛻舳瞬挥煤芨叩拇鷥r(jià)就可以發(fā)起連接查詢,這可能會(huì)導(dǎo)致服務(wù)器上的拒絕服務(wù)(DoS)攻擊。
4、安全 – 身份驗(yàn)證和授權(quán)
GraphQL 社區(qū)仍然對如何處理 GraphQL 服務(wù)的安全部分感到困惑。仍然沒有集成身份驗(yàn)證和授權(quán)的原生解決方案。它通常被抽象到業(yè)務(wù)邏輯層來授權(quán)用戶,但是我們是否真的必須解析和驗(yàn)證一個(gè)未經(jīng)驗(yàn)證的用戶的查詢?nèi)匀皇?GraphQL 領(lǐng)域中的一個(gè)問題。
5、N + 1 次查詢問題
在 RESTful 服務(wù)中,很容易記錄執(zhí)行的 SQL 查詢并進(jìn)一步優(yōu)化它。但在 GraphQL 的情況下,解析性質(zhì)是動(dòng)態(tài)的,因此很難獲得精確的查詢并進(jìn)一步優(yōu)化它。有時(shí),字段解析器可能會(huì)導(dǎo)致 N+1 次查詢問題和復(fù)雜的連接操作。但是 Facebook 正在開發(fā)像 DataLoader 這樣的工具來解決這個(gè)確切的問題。所以,也許在未來,這不會(huì)是一個(gè)不利因素。
原文作者:Summer
原文鏈接: https://dev.to/sadarshannaiynar/graphql-or-rest-what-should-i-use-38mj
譯文鏈接: https://learnku.com/laravel/t/28508