API格局在不斷發(fā)展,一些協(xié)議越來(lái)越受歡迎,而另一些則逐漸衰落。Postman 最新的 API 現(xiàn)狀報(bào)告(https://www.postman.com/state-of-api/api-global-growth/) 基于對(duì) 40,000 多名開(kāi)發(fā)人員的調(diào)查,提供了這些轉(zhuǎn)變的快照,并揭示了哪些 API 協(xié)議目前最受關(guān)注和采用。在本文中,我們將詳細(xì)探討這些 API 協(xié)議,分析它們?yōu)楹我鹑绱舜蟮呐d趣,并深入探討每個(gè)協(xié)議的主要優(yōu)勢(shì)和局限性。
Restful
代表態(tài)轉(zhuǎn)移(REST)仍然是Web API最受歡迎的建筑風(fēng)格。盡管其在調(diào)查受訪者中的使用率略有下降——在過(guò)去兩年中從92%降至86%——但其簡(jiǎn)單性、可擴(kuò)展性和與Web服務(wù)的易集成性鞏固了其在頂部的地位。 具象狀態(tài)傳輸 (REST) 仍然是 Web API 最流行的架構(gòu)風(fēng)格。盡管它在受訪者中的使用率略有下降(在過(guò)去兩年中從 92% 下降到 86%),但它的簡(jiǎn)單性、可擴(kuò)展性以及與 Web 服務(wù)的易集成鞏固了它的領(lǐng)先地位。
REST的好處REST 的優(yōu)勢(shì)
- 簡(jiǎn)單和標(biāo)準(zhǔn)化:通過(guò)利用標(biāo)準(zhǔn)HTTP方法,REST能夠?yàn)橐呀?jīng)精通HTTP的開(kāi)發(fā)人員提供直接采用。這種簡(jiǎn)單性促進(jìn)了快速學(xué)習(xí)和整合。 簡(jiǎn)單性和標(biāo)準(zhǔn)化:通過(guò)利用標(biāo)準(zhǔn)的HTTP方法,REST使已經(jīng)精通HTTP的開(kāi)發(fā)人員能夠直接采用。這種簡(jiǎn)單性促進(jìn)了快速學(xué)習(xí)和集成。
- 可擴(kuò)展性:REST的無(wú)狀態(tài)性質(zhì)確保服務(wù)器不需要在請(qǐng)求之間存儲(chǔ)會(huì)話(huà)數(shù)據(jù)。這通過(guò)添加沒(méi)有共享服務(wù)器狀態(tài)的實(shí)例來(lái)促進(jìn)水平擴(kuò)展。 可擴(kuò)展性:REST的無(wú)狀態(tài)特性確保服務(wù)器不需要在請(qǐng)求之間存儲(chǔ)會(huì)話(huà)數(shù)據(jù)。這通過(guò)添加沒(méi)有共享服務(wù)器狀態(tài)的實(shí)例來(lái)促進(jìn)水平擴(kuò)展。
- 性能:無(wú)狀態(tài)和可緩存響應(yīng)產(chǎn)生更快的執(zhí)行和更少的請(qǐng)求。 性能:無(wú)狀態(tài)和可緩存響應(yīng)可加快執(zhí)行速度并減少請(qǐng)求數(shù)。
- 模塊化:RESTful服務(wù)可以作為模塊化組件開(kāi)發(fā)。這種本地化功能可以實(shí)現(xiàn)獨(dú)立更新并提高可維護(hù)性。 模塊化:RESTful服務(wù)可以作為模塊化組件進(jìn)行開(kāi)發(fā)。這種本地化功能可實(shí)現(xiàn)獨(dú)立更新并提高可維護(hù)性。
- 平臺(tái)無(wú)關(guān):平臺(tái)無(wú)關(guān)的HTTP支持允許不同客戶(hù)使用。由此產(chǎn)生的互操作性促進(jìn)了跨系統(tǒng)的API集成。 與平臺(tái)無(wú)關(guān):與平臺(tái)無(wú)關(guān)的 HTTP 支持允許不同的客戶(hù)端使用。由此產(chǎn)生的互操作性促進(jìn)了跨系統(tǒng)的 API 集成。
- 成熟的工具和社區(qū)支持:REST的長(zhǎng)壽導(dǎo)致了工具、庫(kù)、最佳實(shí)踐、故障排除指導(dǎo)和社區(qū)資源的廣泛擴(kuò)散。 成熟的工具和社區(qū)支持:REST 的長(zhǎng)期存在導(dǎo)致了工具、庫(kù)、最佳實(shí)踐、故障排除指南和社區(qū)資源的廣泛擴(kuò)散。
REST的挑戰(zhàn)REST的挑戰(zhàn)
- 過(guò)度獲取和不足:REST存在過(guò)度獲取或不足數(shù)據(jù)的風(fēng)險(xiǎn),因?yàn)榭蛻?hù)端可能只需要一部分資源。這種缺點(diǎn)可能會(huì)導(dǎo)致性能問(wèn)題和浪費(fèi)帶寬。 過(guò)度獲取和獲取不足:REST 存在過(guò)度獲取或未獲取數(shù)據(jù)的風(fēng)險(xiǎn),因?yàn)榭蛻?hù)端可能只需要一部分資源。此缺點(diǎn)可能會(huì)導(dǎo)致性能問(wèn)題并浪費(fèi)帶寬。
- 聊天界面:檢索相關(guān)數(shù)據(jù)可能需要多個(gè)請(qǐng)求,這會(huì)增加延遲。隨著應(yīng)用程序的擴(kuò)展,這種呼叫瀑布變得特別有問(wèn)題。 聊天界面:檢索相關(guān)數(shù)據(jù)可能需要多個(gè)請(qǐng)求,這會(huì)增加延遲。隨著應(yīng)用程序規(guī)模的擴(kuò)展,這種調(diào)用瀑布式變得尤其成問(wèn)題。
- 版本挑戰(zhàn):創(chuàng)建新版本的REST API可能很麻煩,特別是當(dāng)數(shù)據(jù)結(jié)構(gòu)或服務(wù)功能發(fā)生變化時(shí)。這通常會(huì)導(dǎo)致向后兼容性問(wèn)題。 版本控制挑戰(zhàn):創(chuàng)建 REST API 的新版本可能很麻煩,尤其是在數(shù)據(jù)結(jié)構(gòu)或服務(wù)功能發(fā)生更改時(shí)。這通常會(huì)導(dǎo)致向后兼容性問(wèn)題。
- 無(wú)狀態(tài)開(kāi)銷(xiāo):雖然無(wú)狀態(tài)支持可擴(kuò)展性,但也意味著每個(gè)請(qǐng)求都必須提供所有必要的上下文。這一要求可能會(huì)帶來(lái)開(kāi)銷(xiāo),特別是當(dāng)客戶(hù)必須發(fā)送大量重復(fù)數(shù)據(jù)時(shí)。 無(wú)狀態(tài)開(kāi)銷(xiāo):雖然無(wú)狀態(tài)支持可伸縮性,但這也意味著必須為每個(gè)請(qǐng)求提供所有必要的上下文。此要求可能會(huì)帶來(lái)開(kāi)銷(xiāo),尤其是當(dāng)客戶(hù)端必須發(fā)送大量重復(fù)數(shù)據(jù)時(shí)。
- 缺乏實(shí)時(shí)功能:REST沒(méi)有針對(duì)聊天或?qū)崟r(shí)提要等實(shí)時(shí)應(yīng)用程序進(jìn)行優(yōu)化。WebSockets和服務(wù)器發(fā)送的事件通常更適合此類(lèi)用例。 缺乏實(shí)時(shí)功能:REST 未針對(duì)實(shí)時(shí)應(yīng)用(如聊天或?qū)崟r(shí)提要)進(jìn)行優(yōu)化。WebSocket 和服務(wù)器發(fā)送的事件通常更適合此類(lèi)用例。
WebhooksWebhook
Webhook是由源應(yīng)用程序中的事件觸發(fā)的用戶(hù)定義的HTTP回調(diào)。當(dāng)事件發(fā)生時(shí),源應(yīng)用程序向目標(biāo)應(yīng)用程序指定的URI發(fā)送HTTP請(qǐng)求(通常是POST),這可以在不重復(fù)輪詢(xún)的情況下實(shí)現(xiàn)近實(shí)時(shí)的基于事件的通信。Webhook越來(lái)越受歡迎,36%的開(kāi)發(fā)人員使用它們?cè)诓煌到y(tǒng)之間創(chuàng)建無(wú)縫集成。 Webhook 是用戶(hù)定義的 HTTP 回調(diào),由源應(yīng)用程序中的事件觸發(fā)。當(dāng)事件發(fā)生時(shí),源應(yīng)用程序會(huì)向目標(biāo)應(yīng)用程序指定的 URI 發(fā)送 HTTP 請(qǐng)求(通常為 POST),從而實(shí)現(xiàn)近乎實(shí)時(shí)的基于事件的通信,而無(wú)需重復(fù)輪詢(xún)。Webhook 正變得越來(lái)越流行,36% 的開(kāi)發(fā)人員使用它們?cè)诓煌到y(tǒng)之間創(chuàng)建無(wú)縫集成。
例如,如果您想在博客文章上有新評(píng)論時(shí)收到通知,而不是反復(fù)詢(xún)問(wèn)(投票)服務(wù)器“有新評(píng)論嗎?”,服務(wù)器會(huì)在發(fā)布新評(píng)論時(shí)(通過(guò)網(wǎng)絡(luò)鉤子)通知您。 例如,如果你想在每次博客文章上有新評(píng)論時(shí)都收到通知,而不是反復(fù)詢(xún)問(wèn)(輪詢(xún))服務(wù)器,“有沒(méi)有新評(píng)論?”,服務(wù)器會(huì)在發(fā)布新評(píng)論時(shí)通知你(通過(guò) webhook)。
網(wǎng)絡(luò)鉤子的好處Webhook 的優(yōu)勢(shì)
- 實(shí)時(shí)通信:Webhook可實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)傳輸。事件觸發(fā)時(shí)會(huì)發(fā)送相應(yīng)的數(shù)據(jù),確保系統(tǒng)之間的最新同步。 實(shí)時(shí)通信:Webhook 支持實(shí)時(shí)數(shù)據(jù)傳輸。當(dāng)事件被觸發(fā)時(shí),會(huì)發(fā)送相應(yīng)的數(shù)據(jù),確保系統(tǒng)之間的最新同步。
- 效率:Webhook消除了資源密集型輪詢(xún),節(jié)省了計(jì)算能力和帶寬。 效率:Webhook 消除了資源密集型輪詢(xún),節(jié)省了算力和帶寬。
- 靈活性:Webhooks可以配置為響應(yīng)特定事件,允許您自定義一個(gè)應(yīng)用程序中的哪些操作或觸發(fā)器將向另一個(gè)應(yīng)用程序發(fā)送數(shù)據(jù)。 靈活性:Webhook 可以配置為響應(yīng)特定事件,允許您自定義一個(gè)應(yīng)用程序中的哪些操作或觸發(fā)器將數(shù)據(jù)發(fā)送到另一個(gè)應(yīng)用程序。
- 簡(jiǎn)化集成:HTTP方法使大多數(shù)應(yīng)用程序易于使用。 簡(jiǎn)化的集成:HTTP 方法使大多數(shù)應(yīng)用程序能夠輕松使用。
- 支持解耦架構(gòu):由于網(wǎng)絡(luò)鉤子基于事件運(yùn)行,它們自然支持事件驅(qū)動(dòng)或解耦架構(gòu),增強(qiáng)了模塊化和可擴(kuò)展性。 支持解耦架構(gòu):由于 Webhook 基于事件運(yùn)行,因此它們自然支持事件驅(qū)動(dòng)或解耦架構(gòu),從而增強(qiáng)了模塊化和可擴(kuò)展性。
網(wǎng)絡(luò)鉤子的挑戰(zhàn)Webhook 的挑戰(zhàn)
- 錯(cuò)誤處理:如果網(wǎng)絡(luò)鉤子接收端停機(jī)或處理回調(diào)時(shí)出現(xiàn)錯(cuò)誤,則存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。使用網(wǎng)絡(luò)鉤子的系統(tǒng)必須具有強(qiáng)大的錯(cuò)誤處理機(jī)制,包括重試或日志。 錯(cuò)誤處理:如果 Webhook 的接收端關(guān)閉或在處理回調(diào)時(shí)出現(xiàn)錯(cuò)誤,則存在數(shù)據(jù)丟失的風(fēng)險(xiǎn)。使用 Webhook 的系統(tǒng)必須具有可靠的錯(cuò)誤處理機(jī)制,包括重試或日志。
- 安全問(wèn)題:網(wǎng)絡(luò)鉤子通過(guò)互聯(lián)網(wǎng)傳輸數(shù)據(jù),使它們?nèi)菀资艿綌r截或惡意攻擊。API安全措施,如使用HTTPS和有效負(fù)載簽名,是必不可少的。 安全問(wèn)題:Webhook 通過(guò) Internet 傳輸數(shù)據(jù),使其容易受到攔截或惡意攻擊。API 安全措施(例如使用 HTTPS 和有效負(fù)載簽名)至關(guān)重要。
- 管理多個(gè)網(wǎng)絡(luò)鉤子:管理和監(jiān)控網(wǎng)絡(luò)鉤子可能很復(fù)雜,特別是隨著應(yīng)用程序的發(fā)展并開(kāi)始依賴(lài)多個(gè)網(wǎng)絡(luò)鉤子。確保所有網(wǎng)絡(luò)鉤子正常運(yùn)行并跟蹤各種端點(diǎn)需要勤奮。 管理多個(gè) Webhook:管理和監(jiān)視 Webhook 可能很復(fù)雜,尤其是當(dāng)應(yīng)用程序增長(zhǎng)并開(kāi)始依賴(lài)多個(gè) Webhook 時(shí)。確保所有 Webhook 正常運(yùn)行并跟蹤各種端點(diǎn)需要勤奮。
- 潛在的過(guò)載:大量并發(fā)回調(diào)可能會(huì)使接收應(yīng)用程序不堪重負(fù),但速率限制或批處理可能有助于管理激增。 潛在的過(guò)載:大量并發(fā)回調(diào)可能會(huì)使接收應(yīng)用程序不堪重負(fù),但速率限制或批處理可能有助于管理激增。
GraphQL
GraphQL是一種API的查詢(xún)語(yǔ)言,也是使用您為數(shù)據(jù)定義的類(lèi)型系統(tǒng)執(zhí)行查詢(xún)的服務(wù)器端運(yùn)行時(shí)。GraphQL由Facebook于2012年開(kāi)發(fā),并于2015年作為開(kāi)源項(xiàng)目發(fā)布,為傳統(tǒng)的REST API提供了一個(gè)更靈活、更高效的替代品。GraphQL在開(kāi)發(fā)人員中的采用率增長(zhǎng)了29%,這表明其在當(dāng)今API環(huán)境中的重要性。 GraphQL 是一種用于 API 的查詢(xún)語(yǔ)言,也是一種服務(wù)器端運(yùn)行時(shí),用于使用您為數(shù)據(jù)定義的類(lèi)型系統(tǒng)執(zhí)行查詢(xún)。GraphQL 由 Facebook 于 2012 年開(kāi)發(fā),并于 2015 年作為開(kāi)源項(xiàng)目發(fā)布,為傳統(tǒng)的 REST API 提供了更靈活、更高效的替代方案。GraphQL 在開(kāi)發(fā)人員中的采用率高達(dá) 29%,這表明它在當(dāng)今 API 環(huán)境中的重要性。
與REST不同,您必須點(diǎn)擊多個(gè)API端點(diǎn)才能獲取相關(guān)數(shù)據(jù),GraphQL允許您在單個(gè)查詢(xún)中獲得所需的所有數(shù)據(jù)。這對(duì)前端開(kāi)發(fā)人員特別有用,因?yàn)樗顾麄兡軌蚋玫乜刂茢?shù)據(jù)檢索過(guò)程,并允許他們創(chuàng)建更動(dòng)態(tài)和響應(yīng)靈敏的用戶(hù)界面。 與 REST 不同,在 REST 中,您必須點(diǎn)擊多個(gè) API 端點(diǎn)才能獲取相關(guān)數(shù)據(jù),而 GraphQL 允許您在單個(gè)查詢(xún)中獲取所需的所有數(shù)據(jù)。這對(duì)前端開(kāi)發(fā)人員特別有用,因?yàn)樗顾麄兡軌蚋玫乜刂茢?shù)據(jù)檢索過(guò)程,并允許他們創(chuàng)建更動(dòng)態(tài)和響應(yīng)更靈敏的用戶(hù)界面。
GraphQL的好處GraphQL 的優(yōu)勢(shì)
- 強(qiáng)類(lèi)型模式:GraphQL API具有強(qiáng)類(lèi)型模式,允許開(kāi)發(fā)人員確切知道哪些數(shù)據(jù)和類(lèi)型可供查詢(xún)。 強(qiáng)類(lèi)型架構(gòu):GraphQL API 具有強(qiáng)類(lèi)型架構(gòu),使開(kāi)發(fā)人員能夠確切地知道哪些數(shù)據(jù)和類(lèi)型可供查詢(xún)。
- 精確的數(shù)據(jù)檢索:客戶(hù)可以請(qǐng)求他們需要的精確數(shù)據(jù),這解決了過(guò)度獲取和獲取不足的問(wèn)題,進(jìn)而提高性能并降低成本。 精準(zhǔn)數(shù)據(jù)檢索:客戶(hù)可以請(qǐng)求所需的精準(zhǔn)數(shù)據(jù),解決了超取和欠取的問(wèn)題,進(jìn)而提高了性能,降低了成本。
- 查詢(xún)復(fù)雜性和多個(gè)資源:GraphQL支持在一個(gè)請(qǐng)求中查詢(xún)多種數(shù)據(jù)類(lèi)型,這減少了復(fù)雜、相互關(guān)聯(lián)的數(shù)據(jù)的網(wǎng)絡(luò)請(qǐng)求數(shù)量。 查詢(xún)復(fù)雜度和多種資源:GraphQL 支持在一次請(qǐng)求中查詢(xún)多種數(shù)據(jù)類(lèi)型,從而減少了對(duì)復(fù)雜、相互關(guān)聯(lián)的數(shù)據(jù)的網(wǎng)絡(luò)請(qǐng)求數(shù)量。
- 訂閱實(shí)時(shí)更新:GraphQL通過(guò)訂閱實(shí)現(xiàn)實(shí)時(shí)同步,使客戶(hù)端實(shí)時(shí)更新。 訂閱實(shí)時(shí)更新:GraphQL 支持通過(guò)訂閱進(jìn)行實(shí)時(shí)同步,從而使客戶(hù)端實(shí)時(shí)更新。
- 內(nèi)?。?/strong>GraphQL的自我記錄模式使通過(guò)內(nèi)省更容易開(kāi)發(fā)。 內(nèi)省:GraphQL 的自文檔模式通過(guò)內(nèi)省實(shí)現(xiàn)更輕松的開(kāi)發(fā)。
GraphQL的挑戰(zhàn)GraphQL 的挑戰(zhàn)
- 查詢(xún)復(fù)雜性:GraphQL賦予客戶(hù)端的靈活性有缺點(diǎn),因?yàn)檫^(guò)度復(fù)雜或嵌套的查詢(xún)可能會(huì)對(duì)性能產(chǎn)生負(fù)面影響。 查詢(xún)復(fù)雜性:GraphQL 為客戶(hù)端提供的靈活性也有缺點(diǎn),因?yàn)檫^(guò)于復(fù)雜或嵌套的查詢(xún)會(huì)對(duì)性能產(chǎn)生負(fù)面影響。
- 學(xué)習(xí)曲線:由于突變和訂閱等新概念,GraphQL的學(xué)習(xí)曲線比REST更陡峭。 學(xué)習(xí)曲線:由于突變和訂閱等新概念,GraphQL 的學(xué)習(xí)曲線比 REST 更陡峭。
- 版本控制:查詢(xún)的靈活性意味著模式的變化可能會(huì)破壞現(xiàn)有查詢(xún),使版本管理復(fù)雜化。 版本控制:查詢(xún)的靈活性意味著架構(gòu)中的更改可能會(huì)破壞現(xiàn)有查詢(xún),從而使版本管理復(fù)雜化。
- 資源的潛在過(guò)度使用:由于客戶(hù)可以在一個(gè)查詢(xún)中請(qǐng)求多個(gè)資源,因此通過(guò)獲取不必要的數(shù)據(jù),存在服務(wù)器超載的風(fēng)險(xiǎn)。 潛在的資源過(guò)度使用:由于客戶(hù)端可以在一個(gè)查詢(xún)中請(qǐng)求多個(gè)資源,因此存在通過(guò)獲取不必要的數(shù)據(jù)而使服務(wù)器過(guò)載的風(fēng)險(xiǎn)。
- 安全問(wèn)題:惡意用戶(hù)可以利用GraphQL的靈活性,用復(fù)雜的查詢(xún)使服務(wù)器超載。 安全問(wèn)題:惡意用戶(hù)可能會(huì)利用 GraphQL 的靈活性,通過(guò)復(fù)雜的查詢(xún)使服務(wù)器過(guò)載。
什么是 GraphQL?它是 REST API 的替代品嗎?
下圖顯示了 REST 和 GraphQL 之間的快速比較。
GraphQL 是 Meta 開(kāi)發(fā)的一種 API 查詢(xún)語(yǔ)言。它提供了 API 中數(shù)據(jù)的完整描述,并讓客戶(hù)端能夠準(zhǔn)確請(qǐng)求他們所需的內(nèi)容。
GraphQL 服務(wù)器位于客戶(hù)端和后端服務(wù)之間。
GraphQL 可以將多個(gè) REST 請(qǐng)求聚合為一個(gè)查詢(xún)。GraphQL 服務(wù)器以圖形形式組織資源。
GraphQL 支持查詢(xún)、變異(將數(shù)據(jù)修改應(yīng)用于資源)和訂閱(接收有關(guān)架構(gòu)修改的通知)。
我們?cè)谏现艿囊曨l中討論了 REST API,并將在單獨(dú)的帖子/視頻中比較 REST、GraphQL 和 gRPC。
交給你:
1). GraphQL 是一種數(shù)據(jù)庫(kù)技術(shù)嗎?
2). 你推薦 GraphQL 嗎?為什么/為什么不推薦?
SOAP
簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議(SOAP)是一種用于交換結(jié)構(gòu)化信息以實(shí)現(xiàn)Web服務(wù)的協(xié)議。它使用XML作為消息格式,通常使用HTTP或SMTP作為消息協(xié)商和傳輸層。與REST和GraphQL不同,SOAP具有嚴(yán)格的標(biāo)準(zhǔn)和內(nèi)置功能,如符合ACID的交易、安全性和消息模式。 簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (SOAP) 是一種用于交換結(jié)構(gòu)化信息以實(shí)現(xiàn) Web 服務(wù)的協(xié)議。它使用 XML 作為其消息格式,通常使用 HTTP 或 SMTP 作為消息協(xié)商和傳輸層。與 REST 和 GraphQL 不同,SOAP 具有嚴(yán)格的標(biāo)準(zhǔn)和內(nèi)置功能,如符合 ACID 的事務(wù)、安全性和消息傳遞模式。
盡管其使用量減少——僅占開(kāi)發(fā)人員的26%——但SOAP是某些應(yīng)用程序的可靠選擇。讓我們探索是什么讓SOAP與眾不同,以及與其他API設(shè)計(jì)方法相比,它閃耀的地方。 盡管SOAP的使用率有所降低(僅占開(kāi)發(fā)人員的26%),但對(duì)于某些應(yīng)用程序來(lái)說(shuō),SOAP仍是可靠的選擇。讓我們來(lái)探討一下 SOAP 的獨(dú)特之處,以及它與其他 API 設(shè)計(jì)方法相比的優(yōu)勢(shì)。
SOAP的好處SOAP 的優(yōu)點(diǎn)
- 強(qiáng)大的類(lèi)型和合同:SOAP API具有強(qiáng)大的類(lèi)型和嚴(yán)格的合同,該合同在Web服務(wù)描述語(yǔ)言(WDSL)文檔中定義。 強(qiáng)類(lèi)型化和協(xié)定:SOAP API 具有強(qiáng)類(lèi)型化和在 Web 服務(wù)描述語(yǔ)言 (WDSL) 文檔中定義的嚴(yán)格協(xié)定。
- 內(nèi)置安全功能:SOAP通過(guò)WS-Security標(biāo)準(zhǔn)提供全面的身份驗(yàn)證、授權(quán)和加密。這使得SOAP成為企業(yè)應(yīng)用程序的首選。 內(nèi)置安全功能:SOAP 通過(guò) WS-Security 標(biāo)準(zhǔn)內(nèi)置的身份驗(yàn)證、授權(quán)和加密功能提供全面的安全性。這使得 SOAP 成為企業(yè)應(yīng)用程序的首選。
- ACID交易:SOAP支持ACID交易,這對(duì)數(shù)據(jù)完整性至關(guān)重要的應(yīng)用程序(如金融或醫(yī)療保健系統(tǒng))至關(guān)重要。 ACID 事務(wù):SOAP 支持 ACID 事務(wù),這對(duì)于數(shù)據(jù)完整性至關(guān)重要的應(yīng)用程序(如金融或醫(yī)療保健系統(tǒng))至關(guān)重要。
- 可靠的消息傳遞:SOAP確??煽康南鬟f并很好地處理故障,這使得它非常適合保證消息傳遞至關(guān)重要的系統(tǒng)。 可靠的消息傳遞:SOAP 可確??煽康南鬟f并很好地處理故障,這使得它非常適合有保證的消息傳遞至關(guān)重要的系統(tǒng)。
- 語(yǔ)言、平臺(tái)和傳輸中立性:與REST類(lèi)似,任何了解XML的客戶(hù)端都可以使用SOAP服務(wù),無(wú)論其底層編程語(yǔ)言、平臺(tái)或傳輸協(xié)議如何。 語(yǔ)言、平臺(tái)和傳輸中立性:與 REST 類(lèi)似,任何理解 XML 的客戶(hù)端都可以使用 SOAP 服務(wù),而不管其基礎(chǔ)編程語(yǔ)言、平臺(tái)或傳輸協(xié)議如何。
SOAP的挑戰(zhàn)SOAP的挑戰(zhàn)
- 復(fù)雜性和學(xué)習(xí)曲線:由于其嚴(yán)格的標(biāo)準(zhǔn)和使用XML,SOAP的實(shí)施可能更加復(fù)雜,使學(xué)習(xí)曲線比REST或GraphQL等替代方案更陡峭。 復(fù)雜性和學(xué)習(xí)曲線:由于SOAP的嚴(yán)格標(biāo)準(zhǔn)和XML的使用,SOAP的實(shí)現(xiàn)可能更加復(fù)雜,這使得學(xué)習(xí)曲線比REST或GraphQL等替代品更陡峭。
- 更 Verbose消息:SOAP消息頭承擔(dān)大量開(kāi)銷(xiāo),導(dǎo)致比REST和GraphQL的JSON更大的有效負(fù)載。這會(huì)影響性能和帶寬使用。 冗長(zhǎng)的消息:SOAP 消息標(biāo)頭會(huì)帶來(lái)大量開(kāi)銷(xiāo),這導(dǎo)致負(fù)載比 REST 和 GraphQL 的 JSON 更大。這可能會(huì)影響性能和帶寬使用率。
- 有限的社區(qū)支持:SOAP正在失去優(yōu)勢(shì),這意味著社區(qū)支持和可用的圖書(shū)館正在減少。 有限的社區(qū)支持:SOAP 正在失去優(yōu)勢(shì),這意味著社區(qū)支持和可用庫(kù)正在下降。
- 靈活性較?。?/strong>合同的任何更改都可能需要客戶(hù)端和服務(wù)器更新各自的實(shí)現(xiàn),這可能是一個(gè)缺點(diǎn)。 靈活性較低:合約中的任何更改都可能需要客戶(hù)端和服務(wù)器更新各自的實(shí)現(xiàn),這可能是一個(gè)缺點(diǎn)。
- 防火墻問(wèn)題:SOAP可能會(huì)使用與HTTP/HTTPS不同的傳輸協(xié)議,這意味著它可能會(huì)面臨防火墻限制。這使得SOAP對(duì)某些部署環(huán)境來(lái)說(shuō)不那么通用。 防火墻問(wèn)題:SOAP 可能使用與 HTTP/HTTPS 不同的傳輸協(xié)議,這意味著它可能面臨防火墻限制。這使得 SOAP 對(duì)于某些部署環(huán)境的通用性降低。
WebSocketWebSocket的
WebSocket在客戶(hù)端和服務(wù)器之間提供持久、低延遲、雙向連接,實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)傳輸。與HTTP的請(qǐng)求響應(yīng)周期不同,WebSocket允許服務(wù)器在初始握手后隨時(shí)向客戶(hù)端發(fā)送數(shù)據(jù)。這有助于聊天應(yīng)用程序、在線游戲、交易平臺(tái)等的即時(shí)數(shù)據(jù)更新。 WebSocket 在客戶(hù)端和服務(wù)器之間提供持久、低延遲的雙向連接,從而實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)傳輸。與 HTTP 的請(qǐng)求-響應(yīng)周期不同,WebSocket 允許服務(wù)器在初始握手后的任何時(shí)間向客戶(hù)端發(fā)送數(shù)據(jù)。這有助于聊天應(yīng)用程序、在線游戲、交易平臺(tái)等的即時(shí)數(shù)據(jù)更新。
調(diào)查結(jié)果顯示,25%的開(kāi)發(fā)人員使用WebSocket。讓我們探索它的優(yōu)勢(shì)、挑戰(zhàn)和用例。 調(diào)查結(jié)果顯示,25% 的開(kāi)發(fā)人員使用 WebSocket。讓我們探討一下它的優(yōu)勢(shì)、挑戰(zhàn)和用例。
WebSocket的好處WebSocket 的優(yōu)勢(shì)
- 實(shí)時(shí)雙向通信:實(shí)時(shí)雙向通信的延遲比每個(gè)交換必須重新建立的HTTP連接要少。 實(shí)時(shí)雙向通信:實(shí)時(shí)雙向通信的延遲比必須為每個(gè)交換重新建立的 HTTP 連接要少。
- 較低的開(kāi)銷(xiāo):連接在初始握手后保持開(kāi)放,這降低了傳統(tǒng)HTTP請(qǐng)求附帶的標(biāo)頭的開(kāi)銷(xiāo)。 降低開(kāi)銷(xiāo):連接在初始握手后保持打開(kāi)狀態(tài),從而降低了傳統(tǒng) HTTP 請(qǐng)求附帶的標(biāo)頭開(kāi)銷(xiāo)。
- 高效利用資源:持久連接比長(zhǎng)時(shí)間輪詢(xún)更有效地使用服務(wù)器資源。 有效利用資源:持久連接比長(zhǎng)輪詢(xún)更有效地使用服務(wù)器資源。
WebSocket的挑戰(zhàn)WebSocket 的挑戰(zhàn)
- 實(shí)現(xiàn)復(fù)雜性實(shí)施WebSocket可能比其他API架構(gòu)更復(fù)雜、更耗時(shí)——特別是當(dāng)您考慮到在不支持WebSocket的環(huán)境中需要回退時(shí)。 實(shí)現(xiàn)復(fù)雜性實(shí)現(xiàn) WebSocket 可能比其他 API 架構(gòu)更復(fù)雜、更耗時(shí),尤其是當(dāng)您考慮到在不支持 WebSocket 的環(huán)境中需要回退時(shí)。
- 缺乏內(nèi)置功能與內(nèi)置安全和交易功能的SOAP不同,WebSocket更簡(jiǎn)單。它要求開(kāi)發(fā)人員自己實(shí)現(xiàn)這些功能。 缺乏內(nèi)置功能與帶有內(nèi)置安全和事務(wù)功能的 SOAP 不同,WebSocket 更簡(jiǎn)單。它要求開(kāi)發(fā)人員自己實(shí)現(xiàn)這些功能。
- 資源消耗盡管開(kāi)放的WebSocket連接通常比長(zhǎng)期輪詢(xún)技術(shù)更高效,但它們?nèi)匀粫?huì)消耗服務(wù)器資源,并可能成為大規(guī)模關(guān)注的問(wèn)題。 資源消耗盡管開(kāi)放式 WebSocket 連接通常比長(zhǎng)輪詢(xún)技術(shù)更有效,但它們?nèi)匀粫?huì)消耗服務(wù)器資源,并且可能會(huì)成為大規(guī)模問(wèn)題。
- 網(wǎng)絡(luò)限制一些代理和防火墻不支持WebSocket,導(dǎo)致某些網(wǎng)絡(luò)環(huán)境中的潛在連接問(wèn)題。 網(wǎng)絡(luò)限制某些代理和防火墻不支持 WebSocket,從而導(dǎo)致某些網(wǎng)絡(luò)環(huán)境中的潛在連接問(wèn)題。
gRPCgRPC的
gRPC代表“谷歌遠(yuǎn)程程序呼叫”,是一種現(xiàn)代、高性能的協(xié)議,可促進(jìn)服務(wù)之間的通信。它建立在HTTP/2之上,并利用協(xié)議緩沖區(qū)來(lái)定義服務(wù)方法和消息格式。與依賴(lài)GET和POST等標(biāo)準(zhǔn)HTTP動(dòng)詞的REST API不同,gRPC使服務(wù)能夠公開(kāi)類(lèi)似于編程語(yǔ)言中函數(shù)的自定義方法。 gRPC 代表“Google 遠(yuǎn)程過(guò)程調(diào)用”,是一種現(xiàn)代的高性能協(xié)議,可促進(jìn)服務(wù)之間的通信。它建立在 HTTP/2 之上,并利用協(xié)議緩沖區(qū)來(lái)定義服務(wù)方法和消息格式。與依賴(lài)于標(biāo)準(zhǔn) HTTP 謂詞(如 GET 和 POST)的 REST API 相比,gRPC 使服務(wù)能夠公開(kāi)類(lèi)似于編程語(yǔ)言中的函數(shù)的自定義方法。
gRPC的好處gRPC 的優(yōu)點(diǎn)
- 性能:HTTP/2和協(xié)議緩沖區(qū)使gRPC能夠?qū)崿F(xiàn)低延遲和高吞吐量。 性能:HTTP/2 和協(xié)議緩沖區(qū)使 gRPC 能夠?qū)崿F(xiàn)低延遲和高吞吐量。
- 強(qiáng)打字:像SOAP和GraphQL一樣,gRPC是強(qiáng)打字的。隨著類(lèi)型在編譯時(shí)被驗(yàn)證,這導(dǎo)致錯(cuò)誤減少。 強(qiáng)類(lèi)型:與 SOAP 和 GraphQL 一樣,gRPC 是強(qiáng)類(lèi)型。這樣可以減少錯(cuò)誤,因?yàn)樵诰幾g時(shí)會(huì)驗(yàn)證類(lèi)型。
- 多語(yǔ)言支持:gRPC對(duì)許多編程語(yǔ)言有一流的支持,包括Go、Java、C#和Node.js。 多語(yǔ)言支持:gRPC 對(duì)許多編程語(yǔ)言提供一流的支持,包括 Go、Java、C# 和 Node.js。
- 流媒體:gRPC開(kāi)箱即用地處理流媒體請(qǐng)求和響應(yīng),解鎖了長(zhǎng)期連接和實(shí)時(shí)更新等復(fù)雜用例。 流式處理:gRPC 開(kāi)箱即用地處理流式處理請(qǐng)求和響應(yīng),從而解鎖復(fù)雜的用例,例如長(zhǎng)期連接和實(shí)時(shí)更新。
- 包括電池:gRPC直接支持負(fù)載平衡、重試和超時(shí)等關(guān)鍵功能。 包括電池:gRPC 直接支持負(fù)載均衡、重試和超時(shí)等關(guān)鍵功能。
gRPC的挑戰(zhàn)gRPC 的挑戰(zhàn)
- 瀏覽器支持:瀏覽器中的原生gRPC支持仍然有限,使其不太適合Web應(yīng)用程序中的直接客戶(hù)端到服務(wù)器通信。 瀏覽器支持:瀏覽器中的本機(jī) gRPC 支持仍然有限,因此不太適合 Web 應(yīng)用程序中的直接客戶(hù)端到服務(wù)器通信。
- 學(xué)習(xí)曲線:開(kāi)發(fā)人員需要學(xué)習(xí)如何使用協(xié)議緩沖區(qū)、自定義服務(wù)定義和其他gRPC功能,這可能會(huì)降低初始生產(chǎn)力。 學(xué)習(xí)曲線:開(kāi)發(fā)人員需要學(xué)習(xí)如何使用協(xié)議緩沖區(qū)、自定義服務(wù)定義和其他 gRPC 功能,這可能會(huì)降低初始工作效率。
- 調(diào)試復(fù)雜性:協(xié)議緩沖區(qū)不可人類(lèi)閱讀,這使得調(diào)試和測(cè)試gRPC API比JSON API更難。 調(diào)試復(fù)雜性:協(xié)議緩沖區(qū)不是人類(lèi)可讀的,因此調(diào)試和測(cè)試 gRPC API 比 JSON API 更難。
其他API協(xié)議其他 API 協(xié)議
雖然之前討論的協(xié)議是當(dāng)今API領(lǐng)域最廣泛采用的,但Postman的API狀態(tài)報(bào)告還強(qiáng)調(diào)了一些服務(wù)于特定用例的其他方法: 雖然前面討論的協(xié)議是當(dāng)今 API 領(lǐng)域中采用最廣泛的協(xié)議,但 Postman 的 API 現(xiàn)狀報(bào)告還強(qiáng)調(diào)了其他一些服務(wù)于特定用例的方法:
- MQTT是一種針對(duì)物聯(lián)網(wǎng)等低帶寬網(wǎng)絡(luò)優(yōu)化的輕量級(jí)消息傳遞協(xié)議。它允許客戶(hù)通過(guò)經(jīng)紀(jì)人發(fā)布和訂閱消息,但它缺乏一些安全性和可擴(kuò)展性功能。 MQTT 是一種輕量級(jí)消息傳遞協(xié)議,針對(duì)物聯(lián)網(wǎng)等低帶寬網(wǎng)絡(luò)進(jìn)行了優(yōu)化。它允許客戶(hù)端通過(guò)代理發(fā)布和訂閱消息,但它缺乏一些安全性和可伸縮性功能。
- AMQP是一個(gè)更強(qiáng)大的企業(yè)消息傳遞標(biāo)準(zhǔn),可確??煽康膫鬟f和靈活的消息路由。然而,它可能很復(fù)雜,并且比輕量級(jí)協(xié)議有更多的開(kāi)銷(xiāo)。 AMQP 是一種更強(qiáng)大的企業(yè)消息傳遞標(biāo)準(zhǔn),可確??煽康南鬟f和靈活的路由。但是,它可能很復(fù)雜,并且比輕量級(jí)協(xié)議具有更多的開(kāi)銷(xiāo)。
- SSE通過(guò)HTTP實(shí)現(xiàn)單向服務(wù)器到客戶(hù)端通信。它非常適合實(shí)時(shí)更新,但它缺乏雙向功能。 SSE 支持通過(guò) HTTP 進(jìn)行單向服務(wù)器到客戶(hù)端的通信。它非常適合實(shí)時(shí)更新,但缺乏雙向功能。
- EDI通過(guò)標(biāo)準(zhǔn)化采購(gòu)訂單和發(fā)票等電子文檔來(lái)自動(dòng)化B2B通信,但它也需要具有高初始成本的復(fù)雜基礎(chǔ)設(shè)施。 EDI 通過(guò)標(biāo)準(zhǔn)化采購(gòu)訂單和發(fā)票等電子文檔來(lái)自動(dòng)化 B2B 通信,但它也需要復(fù)雜的基礎(chǔ)設(shè)施和高昂的初始成本。
- EDA推廣了組件響應(yīng)事件的事件驅(qū)動(dòng)架構(gòu),使可擴(kuò)展但調(diào)試復(fù)雜的實(shí)時(shí)系統(tǒng)成為可能。 EDA 提倡事件驅(qū)動(dòng)架構(gòu),其中組件對(duì)事件做出反應(yīng),使實(shí)時(shí)系統(tǒng)具有可擴(kuò)展性,但調(diào)試復(fù)雜。
這些協(xié)議并不普遍,但它們支持物聯(lián)網(wǎng)、企業(yè)消息傳遞、B2B交易和事件驅(qū)動(dòng)系統(tǒng)的專(zhuān)業(yè)應(yīng)用程序。通過(guò)選擇適合其特定需求的正確方法,開(kāi)發(fā)人員可以構(gòu)建超越通用標(biāo)準(zhǔn)的優(yōu)化API解決方案。 這些協(xié)議并不普遍,但它們支持物聯(lián)網(wǎng)、企業(yè)消息傳遞、B2B 交易和事件驅(qū)動(dòng)系統(tǒng)中的專(zhuān)業(yè)應(yīng)用。通過(guò)根據(jù)其特定需求選擇正確的方法,開(kāi)發(fā)人員可以構(gòu)建超越通用標(biāo)準(zhǔn)的優(yōu)化 API 解決方案。
結(jié)論
隨著開(kāi)發(fā)人員采用新的架構(gòu)、協(xié)議和工具,API格局繼續(xù)發(fā)展。雖然REST因其簡(jiǎn)單性和無(wú)處不在而仍然占主導(dǎo)地位,但GraphQL和gRPC等替代品正在通過(guò)解決過(guò)度調(diào)和聊天界面等痛點(diǎn)而獲得牽引力。開(kāi)發(fā)人員也越來(lái)越重視實(shí)時(shí)通信,隨著網(wǎng)絡(luò)鉤子和WebSocket的崛起來(lái)滿(mǎn)足這一需求。 隨著開(kāi)發(fā)人員采用新的架構(gòu)、協(xié)議和工具,API 環(huán)境也在不斷發(fā)展。雖然 REST 因其簡(jiǎn)單性和無(wú)處不在而仍然占據(jù)主導(dǎo)地位,但像 GraphQL 和 gRPC 這樣的替代品通過(guò)解決過(guò)度獲取和聊天界面等痛點(diǎn)而越來(lái)越受歡迎。開(kāi)發(fā)人員也越來(lái)越重視實(shí)時(shí)通信,Webhook 和 WebSocket 的興起滿(mǎn)足了這一需求。
對(duì)于許多常見(jiàn)的API用例來(lái)說(shuō),鑒于其可擴(kuò)展性、互操作性和易用性,REST仍然是一個(gè)堅(jiān)實(shí)的基礎(chǔ)方法。它還受益于社區(qū)成熟。盡管如此,每個(gè)協(xié)議都會(huì)帶來(lái)權(quán)衡,隨著應(yīng)用程序變得越來(lái)越復(fù)雜,開(kāi)發(fā)人員正在明智地?cái)U(kuò)展他們的API協(xié)議工具包,以包括GraphQL和gRPC等專(zhuān)業(yè)解決方案。 對(duì)于許多常見(jiàn)的 API 用例,鑒于其可擴(kuò)展性、互操作性和易采用性,REST 仍然是一種堅(jiān)實(shí)的基礎(chǔ)方法。它仍然受益于社區(qū)的成熟度。盡管如此,每個(gè)協(xié)議都存在權(quán)衡取舍,隨著應(yīng)用程序變得越來(lái)越復(fù)雜,開(kāi)發(fā)人員正在明智地?cái)U(kuò)展他們的 API 協(xié)議工具包,以包括 GraphQL 和 gRPC 等專(zhuān)門(mén)的解決方案。
與其說(shuō)是某個(gè)協(xié)議是萬(wàn)能的靈丹妙藥,不如讓現(xiàn)代 API 開(kāi)發(fā)人員了解多種協(xié)議的優(yōu)缺點(diǎn)。通過(guò)構(gòu)建結(jié)合 REST、Webhook、WebSockets、GraphQL 和其他獨(dú)特方法的系統(tǒng),開(kāi)發(fā)人員可以構(gòu)建健壯、高效且可維護(hù)的 API。雖然單個(gè)協(xié)議的受歡迎程度將繼續(xù)波動(dòng),但總體趨勢(shì)是 API 領(lǐng)域的多樣性增加。開(kāi)發(fā)人員應(yīng)該接受這種多協(xié)議理念來(lái)制定最佳的 API 解決方案。