
使用Node.js、Express和MySQL構建REST API
這些協議有什么不同?為什么要有那么多種協議?這些協議到底要怎么使用?
本文盤點了其中最常用的九大 API 協議/接口規范,它們分別是:
REST 其實不是一種協議,REST 接口使用的網絡協議是 HTTP。
HTTP 協議非常適合那些采用單向的請求 – 響應模式的應用,比如訪問社交媒體上的照片或者新聞文章,但是它并不適合需要雙方實時通信的應用,比如在線游戲或視頻聊天。
REST 是在開發者使用 HTTP 協議時共同遵守的設計原則,是一種軟件架構風格,它并不是一種硬性的技術標準。REST 風格 API 一般長這個樣子:
瀏覽器可能是最簡單的 REST 接口調用工具。瀏覽器地址欄就是一個最原始的 GET 請求發起器,它會將 GET 返回的數據展示在網頁里。
但是,要實現 POST、PUT、DELETE 等動作就要寫代碼了。當然,你也可以使用像 Apifox 這樣的 API 工具,一鍵發起各種類型的 HTTP 請求。
在上面的 REST 接口里,我們需要預先定義好各種具體的操作的接口(獲取所有用戶,獲取特定用戶,按標簽查詢用戶等),就像飯店里固定搭配的套餐。
而 GraphQL 是一種靈活的數據查詢語言,讓你可以像點餐一樣精確地獲取你需要的數據,好比你在餐館里直接告訴服務員想要哪些食物,以及烹飪方式,而不是被迫點一份固定的套餐。
GraphQL 適用于那些需要大量互動、實時數據或者多層次數據的應用。比如社交媒體的實時消息更新、即時通訊或者數據可視化工具。它能夠滿足不同應用的各種需求,因為你可以在一個請求中包含多個查詢,從而減少了網絡請求的數量。
當使用 GraphQL 進行數據調用時,你會構建一個查詢(Query)來獲取你需要的數據。這個查詢看起來類似于一個 JSON 對象,你可以指定所需的字段和參數。以下是一個簡單的 GraphQL 查詢示例,假設我們要獲取一個博客應用中的文章信息:
在這個查詢中:
當發送這個查詢到 GraphQL 服務器時,服務器會返回一個 JSON 響應,包含與查詢匹配的數據。好比構建一個查詢,指定你需要的數據字段,然后向服務器發送查詢,并接收服務器返回的 JSON 響應以獲取所需的數據。響應可能如下所示:
這個響應包含了我們所請求的文章的標題、內容以及作者的信息。所有數據都以嵌套的方式返回,與查詢的結構一致。這種方式允許客戶端精確地獲取所需的數據,而不會浪費帶寬和資源。
在 Apifox 中,可以直接使用 HTTP POST 方式發起 GraphQL API 請求。你只需要將 Body 類型指定為 GraphQL,將請求 JSON 寫入 Query 即可。
你可以在 Query 中使用變量,將變量值寫入 Variables 框,就可以更加便利地調用固定格式的 GraphQL 請求。
SOAP(Simple Object Access Protocol,簡單對象訪問協議)是一種跟 REST 類似,但更古早一點的協議。它跟 REST 的最大的差異是使用 XML 方式作為 body 來傳遞信息。它提供了強大的功能,包括安全性、事務性操作和可擴展性,但也因其 XML 格式相對冗長而被一些新的通信協議所取代。
Web Service 是一個比較古早的名詞,現在一般指使用 SOAP 協議的接口服務。
要使用 SOAP/Web Service,你需要定義一個 SOAP 消息的格式,通常使用 XML 來表示消息的結構和內容。消息由一個 envelope(信封)包裹起來,其中包含了 header(頭部)和 body(主體)部分。header 可用于包含一些元數據和安全信息,而 body 包含實際的數據。
在 Apifox 中調試 SOAP 接口時,只需要根據接口實際情況,手動設置 Header 的 Content-Type 的值為 text/xml; charset=utf-8 或 application/soap+xml,然后設置 Body 格式為 xml,點擊「發送」,即可收到 SOAP 接口返回的 XML 格式的數據。
無論是 REST、GraphQL 還是 SOAP,都是一問一答式的通信。但有時我們需要更高頻的數據交換,比如實時聊天,這時候就需要一種新的協議來解決了。
WebSocket 是一種特殊的通信協議,它與傳統的 HTTP 協議不同,它更像是一條電話線,允許服務器和客戶端之間進行實時、雙向的對話。就像是你在打電話,而不只是發短信。
WebSocket 適合處理需要實時性和雙向通信的應用,比如在線聊天、多人協作編輯、在線游戲或者實時股票市場數據更新。它能夠讓服務器主動向客戶端發送消息,而不必等待客戶端的請求。這種特性對于那些需要即時響應的應用非常重要。
與 HTTP 不同,WebSocket 不是一次性的請求-響應模式。它通過建立一個持久連接,雙方可以隨時發送消息。這就像是你與朋友進行實時對話,而不是發電子郵件等待回復。
在 Apifox 中,你可以輸入服務器 URL,點擊「連接」,一個 Websocket 長連接就建立起來了。
接下來,你可以通過發送 JSON 數據的方式跟服務器通信,也可以實時接收到服務器下發的數據,實現雙向實時數據傳輸。你可以在左下角的時間線視圖里方便地查看所有通信記錄。
Apifox 還支持直接生成 Websocket 協議的 API 文檔。你可以點擊查看更多使用技巧:《Apifox WebSocket 調試功能你會用了嗎?》
Socket 協議是一個非常古早的通信模型,使用 TCP 作為網絡通信協議,允許不同程序/計算機之間通過網絡傳輸數據。Socket 通信也是一種實時、雙向的通信方式,客戶端和服務器之間建立持久連接后,雙方可以隨時發送和接收數據。
不過與 WebSocket 有所區別的是,Socket 提供了底層的網絡編程接口,允許開發者完全控制數據傳輸過程。并且采用 TCP 協議使得 Socket 用于更廣的場景,包括實時通信、文件傳輸、遠程控制等。
進入 Apifox 項目后,點擊左側搜索框旁邊的 + 號按鈕,輕點「新建 Socket 服務」選項。
創建了 Socket 服務之后,可以繼續添加在 Socket 服務之下的接口。Apifox 支持自定義接口請求和響應的數據處理函數,方便進行各種靈活的調試。
當我們在使用 ChatGPT 聊天的時候,你會發現文字是一個一個蹦出來的,這跟微信聊天又有所不同。
ChatGPT 使用的是 SSE(Server-Sent Events)技術,全稱是服務器推送事件,它是一種基于 HTTP 協議的實時通信技術。用于在客戶端和服務器之間建立持久、單向的鏈接。雖然和 WebSocket 類似都具備實時連接功能,但 WS 是支持雙向連接的,而 SSE 是單向的,只支持服務端向客戶端發送異步消息,使得它對帶寬資源消耗較小。
也就是說,WebSocket 是兩個人互相打電話,而 SSE 是客戶端發短信,服務端講電話。
使用 Apifox 調試 SSE 接口時,僅需要像調試普通的 HTTP 接口一樣新建接口。
當接口的返回數據的 Content-Type 包含 text/event-stream 參數時,Apifox 會自動將返回的數據解析為 SSE 事件,并以全新的時間線視圖實時更新響應內容。
前面的各種協議,大都適用于前端和后端的通信。而 gRPC(gRPC Remote Procedure Call,遠程過程調用)不同,它更多地是用于后端和后端之間的通信。
在大型企業中,往往使用微服務架構,不同的服務由不同的系統實現。比如訂單服務、商品服務、用戶信息服務部署在不同的服務器上,這些系統可能使用了各自不同的技術。
gRPC 適合用于構建分布式系統中的微服務架構,尤其是需要高性能、低延遲和跨語言通信的情況。與傳統的 HTTP 或 REST API 相比,gRPC 更加輕量級且高效,它使用 Protocol Buffers(ProtoBuf)作為數據序列化格式,這使得數據傳輸更加緊湊和快速。
一個典型的 gRPC 場景包括多個微服務之間的通信,例如用戶服務需要從訂單服務獲取信息。gRPC 允許你定義服務接口和方法,并生成客戶端和服務器端的代碼,使得開發過程更加簡化。這就像是國際郵件服務,你只需知道如何填寫地址和標明信件的內容,剩下的工作由郵遞員和郵局來完成。
在企業中,后端往往會使用 gRPC 來調用企業內部不同系統之間的服務,而使用 REST API 來對前端提供服務。
你只需要先在 Apifox 中創建 gRPC 項目即可開始調試:
Apifox 支持以下 4 種類型方法調用 gRPC 接口:
相較于市面上的其它 gRPC 調試軟件,Apifox 為 gRPC 流式調用提供了一個時間線視圖,按照時間順序集中展示調用狀態、發送和收到的消息。
Dubbo 框架是由阿里巴巴開發的一款分布式服務框架,Dubbo 協議是該框架中的一部分,用于微服務之間的通信。
Dubbo 協議的使用場景跟 gRPC 是類似的,主要用于后端之間的通信。兩者都是強大的分布式通信框架,選擇哪一個取決于你的具體需求和技術棧。如果你在 Java 生態系統中工作,并需要穩定性和可用性,Dubbo 可能是更好的選擇。如果你需要跨語言支持、強類型定義和高性能的通信,gRPC 可能更適合你。
Dubbo 協議采用了二進制序列化和網絡傳輸方式,相比 REST API 采用文本模式傳輸數據,二進制格式數據傳輸模式可以提供更高的效能和花費更小的開銷,非常適合內網環境。
因此 Dubbo 協議尤其擅長處理大規模微服務架構中的服務調用和治理問題,支持多種主流網絡傳輸協議和多種序列化格式,在國內的后端開發者當中十分流行。
Apifox 支持管理與調試 Dubbo 項目,目前支持 ZooKeeper、Nacos、阿里云 EDAS 三種外部導入渠道。
導入接口后,點擊右上角的「調用」按鈕,即可得到接口的返回結果。
MsgPack(MessagePack)也不是協議。它是一種將數據序列化成緊湊的二進制格式的開放標準。它就像是將數據壓縮成小巧的包裹,以便于在不同系統之間更快地傳輸和存儲。MsgPack 適合用于需要高效傳輸數據的場景,尤其對網絡流量敏感的移動 APP 中。與 JSON 等文本格式相比,MsgPack 的二進制格式更加緊湊,節省了更多帶寬和存儲空間。
一些典型的使用場景包括:
MsgPack 有多種語言的實現,因此可以輕松地在不同編程語言之間進行數據交換。它還支持多種數據類型,包括數字、字符串、數組、映射和自定義類型,使得它非常靈活。
在 Apifox 中,可以直接使用 HTTP POST 方式發起 MsgPack 請求,只需要將 Body 類型選擇為 MsgPack,將請求 JSON 寫入 Query 即可。
以上列出了九種常用的 API 協議/接口規范,Apifox 現已全部支持。
Apifox 作為先進的 API 設計/開發/測試工具,不斷兼容市面上流行的 API 協議,讓開發人員不必再為某個 API 協議而苦苦尋找接口調試工具。
Apifox = Postman + Swagger + Mock + JMeter
一個工具就可以解決 API 開發 → 調試 → 管理問題,讓更多中國開發團隊也能夠體驗到一流的一站式 API 管理方案。
文章轉自微信公眾號@芋道源碼