
使用NestJS和Prisma構建REST API:身份驗證
在RESTful API中,每個資源都可以通過唯一的URL進行標識和訪問。客戶端可以通過發送HTTP請求來執行各種操作,如獲取資源、創建新資源、更新現有資源或刪除資源。RESTful API的設計遵循一些基本原則,如資源的表達、客戶端-服務器架構、無狀態性和緩存等。REST API 支持本地 HTTP 緩存頭,并使用 HTTP 方法(POST、 GET、 PUT、 PATCH 和 DELETE)來操作數據。任何人都可以很容易地開始使用 REST,很簡單,而且學習曲線平滑。它還具有良好的可讀性和可維護性,因為其使用標準的HTTP方法和狀態碼來表示不同的操作結果。
然而,RESTful API也有一些限制。由于其無狀態性,每次請求都需要包含所有必要的信息,這可能會導致數據傳輸量較大。隨著應用程序的擴展,端點的數量急劇增加,更新數據庫模式或數據結構也并不容易。此外,對于復雜的業務邏輯,RESTful API可能不夠靈活,需要額外的架構和設計來滿足需求。
如果沒有任何特定的需求,REST 是最好的選擇。例如,如果是開發新手,那么使用 REST 是完美的匹配,因為它的學習曲線比較淺。此外,它還有一個很大的生態系統,可以很容易地找到任何問題的解決方案。另外,在處理許多請求和有限的帶寬時,最好使用 REST。在這種情況下,可以使用其緩存支持來提高性能。
GraphQL 是2015年引入的一種數據查詢語言。它允許開發人員精確定位并獲取他們需要的確切數據。與 REST 相比,GraphQL 是一種客戶端驅動的方法,客戶端可以決定需要什么數據、如何獲取數據以及格式。它還解決了取得過多和取得不足的問題,因為客戶端可以精確定位所需的數據。
對于 API 而言,GraphQL 被視為一種新思路。GraphQL 既是一種用于 API 的查詢語言也是一個滿足你數據查詢的運行時環境。GraphQL 對 API 中的數據提供了一套易于理解的完整描述,也讓 API 更容易地隨著時間推移而演進。GitHub 是使用 GraphQL 的最大公司之一。2016年,GitHub 從 REST 轉向 GraphQL,極大地促進了 GitHub 的快速增長。關于 GraphQL 的介紹,網上已經有非常多的資料了,這里不再過多描述,具體可以參考 GraphQL.org。
在 GraphQL 中,類型系統用于描述 GraphQL Server 的能力并用于判斷一個查詢是否有效。類型系統還描述了查詢參數的輸入類型,并在 GraphQL Runtime 中檢查參數值的有效性。一個 GraphQL 服務是通過定義類型和類型上的字段來創建的,然后給每個類型上的每個字段提供解析函數。例如,在 Github GraphQL Server 中,使用viewer字段來描述當前登錄用戶的信息,而viewer的類型為User。一旦啟動某個 GraphQL Server,它就能接受 GraphQL 查詢,并驗證和執行該查詢。GraphQL Server 首先會檢查該查詢以確保它只引用了已定義的類型和字段,然后運行指定的解析函數來生成結果。
與使用普通的 REST API 相比,強類型系統是 GraphQL 最吸引人的地方之一。GraphQL類型系統是其根基,所有人必須遵守,這就在大家對API接口描述形成統一認識上發揮著重要作用。在 GraphQL 中,GraphQL Runtime 確定 GraphQL Server 可以提供的能力,而消費端具體要獲取哪些數據則完全由消費者說了算。客戶端(消費端)可以以更加平等的地位,更加積極地參與到整個的數據交互過程。借助于GraphQL的類型系統,客戶端可以更加自由地根據自己的需求來獲得自己的所需,而無需受到 Server 端的限制。
GraphQL 不但改變了通信雙方的話語權,還使得客戶端可以精確地預測服務端的響應。對于 API 的版本控制而言,GraphQL 借鑒了其他語言中的 @deprecated注解。
GraphQL的不足之處在于查詢可能很復雜,缺乏內置的緩存支持。與 REST 相比,學習 GraphQL 具有一定挑戰性,并且默認情況下它不支持文件上傳。
即便如此,在確定是否要使用 GraphQL 技術時,仍需要做認真的分析,且不可為了追新而采用 GraphQL。GraphQL 是查詢具有多條記錄的數據庫的極佳選擇。您可以使用 GraphQL 消除數據的額外讀取,并且只檢索特定格式的必要數據以提高應用程序性能。此外,GraphQL 非常適合于需要從多個資源聚合數據的情況。當不完全理解客戶端如何使用 API 時,也可以使用 GraphQL。使用 GraphQL,不需要事先定義一個嚴格的契約。相反,可以根據客戶端反饋逐步構建 API。
gRPC 是 Google 在2016年引入的開源遠程過程調用(RPC)框架,使用 Protocol Buffers(protobuf)作為接口描述語言。它是一個輕量級的解決方案,并使用最少的資源提供最大的性能。
gRPC 遵循基于契約的通信方法。它要求客戶機和服務器在開始通信之前都要有契約。GRPC 使用 Protobuf (一種聲明性語言)創建契約,它使用選定的語言為客戶機和服務器生成兼容的代碼。gRPC 提供了多語言的支持,包括但不限于C++, Java, Python, Go, Node.js等。這使得開發者可以在不同的語言中構建相互兼容的服務和客戶端。
gRPC 支持4種通信方式:
gRPC 使用 HTTP/2 作為底層傳輸協議,帶來了更高的性能和效率。HTTP/2 支持多路復用、頭部壓縮和二進制傳輸等特性,提高了通信的速度和資源利用率。它以二進制格式序列化數據,支持全雙工通信,還能夠進行負載平衡。gRPC 擁有豐富的生態系統,包括支持各種語言的庫和工具。它還與 Kubernetes、Envoy、Istio等流行的開源項目集成,提供更全面的解決方案。gRPC
總體而言,gRPC 是一個強大而高效的 RPC 框架,適用于構建分布式系統、微服務架構和支持實時通信的應用程序。其設計理念注重性能、可擴展性和跨語言支持,使得它在現代應用開發中得到廣泛應用。
Webhook是一種強大的技術,它可以實現系統之間的即時更新和通知。通過使用HTTP回調機制,Webhook能夠確保各個系統之間的數據保持同步。
使用 Webhooks 時,一個應用程序(服務提供者)通常會提供一個注冊接口,讓另一個應用程序(服務消費者)注冊感興趣的事件。注冊成功后,服務提供者將在相關事件發生時向服務消費者提供的回調地址發送 HTTP 請求,以觸發相應的動作。
Webhook的工作原理很簡單。當某個事件發生時,例如用戶提交表單、發布新的文章或更新數據庫,服務器會向預先定義的URL發送一個HTTP POST請求。這個URL可以是第三方應用程序的API端點,也可以是自己搭建的服務器。在接收到請求后,服務器會執行相應的邏輯,并將結果通過HTTP響應返回給調用方。
通過這種方式,Webhook實現了系統之間的實時通信和數據同步。它消除了輪詢和定期請求的需求,減少了網絡流量和延遲。同時,Webhook還具有高度的可擴展性和靈活性,可以適應各種不同的應用場景。無論是開發電子商務網站、社交應用還是物聯網設備,Webhook都是一個非常有用的工具。
SSE是一種基于HTTP的通信協議,它允許服務器向客戶端推送實時更新的數據。與傳統的輪詢或長輪詢不同,SSE通過建立持久的連接來實現數據的雙向通信。一旦連接建立,服務器就可以通過該連接將數據推送到客戶端,而無需客戶端再次發起請求。例如,客戶端首先發送一個HTTP GET請求到服務器,以建立持久的連接。然后,服務器會保持該連接打開,并隨時將新的數據推送到客戶端。客戶端可以通過解析服務器發送的事件流來實時顯示或處理這些數據。對基于Web的應用而言, 瀏覽器對SSE的支持如下:
由于SSE是基于HTTP協議的,因此它可以與各種編程語言和平臺兼容。無論是JavaScript、Python還是Java,都可以通過相應的庫或框架來使用SSE。此外,SSE還具有良好的可擴展性和性能優勢,適用于處理大量的實時數據更新。
使用Server-Sent Events (SSE),可以體驗到實時數據更新的便捷性,這種輕量級協議非常適合用于傳輸動態內容和即時信息。無論是開發實時聊天應用、新聞聚合網站還是監控儀表盤,SSE都是一個非常有用的工具。
???????????????????? ???????? ?????????????????????? (??????) 是一個用于交換商業文檔的標準。它通過規范文檔的結構和內容,使得不同系統之間能夠更順暢地交換業務信息, 也就是說,規范了API 通信內容的格式。通過使用??????標準,企業可以簡化業務流程,提高自動化程度,并降低交易成本。
EDI可以通過API來實現互操作性。EDI將企業間的商業文檔轉換為標準的數據格式,這些數據格式轉換為其他應用程序所需的數據格式。EDI可以將企業間的商業文檔與企業內部的數據進行集成,而API可以將不同應用程序之間的數據進行集成,從而實現數據的共享和流通。EDI可以自動處理商業文檔,通過API可以自動處理應用程序之間的數據交換和通信,從而實現業務流程的自動化。
對信息安全而言,EDI可以使用加密和數字證書等安全措施,而API可以使用訪問控制和身份驗證等安全措施,從而保障信息的安全性。同時I可以通過數據分析來實現數據的挖掘和分析。EDI可以將企業間的商業文檔進行匯總和分析,并且以API將不同應用程序之間的數據進行匯總和分析,從而實現數據的挖掘和分析。
“Event-Driven Architecture (EDA)” 指的是事件驅動架構,在API的領域中,表示為API而設計的事件驅動架構。
事件驅動架構強調系統中各個組件之間通過事件進行通信和協作。在這種架構中,組件可以是獨立的服務、模塊、或者整個系統。事件是系統中發生的事情,可能是狀態變化、用戶動作、外部觸發等。當事件發生時,系統中的組件可以發布(或廣播)該事件,同時對該事件感興趣的其他組件可以訂閱這些事件并做出響應。
Event-Driven Architecture 將事件驅動的思想應用于API設計和交互。這種架構風格在處理異步、分布式、和實時性要求較高的應用中非常有用。這一架構強調了通過事件的發布和訂閱機制實現 API 組件之間的松散耦合。API 組件可以是生產者(發布事件的組件)或消費者(訂閱并響應事件的組件)。DA使得 API 的通信變得異步化,允許組件在不直接等待響應的情況下繼續執行。這有助于提高系統的性能和可伸縮性。
事件驅動的架構適用于需要實時性響應的場景,例如實時數據更新、通知推送等。通過事件分發機制,系統可以更即時地響應發生的變化。事件驅動的特性有助于微服務之間的通信和協作。一般地,API 網關可以充當事件的分發者,負責將事件發送到相應的訂閱者。這有助于集中管理事件的流向和處理。通過使用事件來驅動 API 的交互,系統能夠更好地適應動態變化和不同組件之間的異步通信需求。
WebSocket 實現了客戶端和服務器之間的雙向通信,為雙方提供了一種實時而高效的交互方式。通過 WebSocket,客戶端和服務器之間可以建立持久性的連接,使得雙方可以在任何時候都能夠發送和接收數據。這種雙向通信機制極大地拓展了傳統的請求-響應模型,為開發者提供了更靈活、更即時的交互手段。
WebSocket 協議通過在客戶端和服務器之間創建一個持久性連接,允許雙方通過單個socket進行實時通信。與傳統的 HTTP 請求-響應模型不同,WebSocket 不需要在每次通信時都建立新的連接,從而減少了通信的開銷和延遲。這對于實時應用程序、在線游戲、聊天應用等場景非常有益。
在 WebSocket 中,客戶端和服務器之間的通信基于事件。一旦連接建立,任何一方都可以異步地發送消息給對方,而對方也能夠立即接收并響應。這種實時的雙向通信機制極大地提高了應用程序的交互性,使得用戶能夠在無感知延遲的情況下享受到更加流暢的應用體驗。
總體而言,WebSocket 的引入使得 Web 應用程序在處理實時數據、推送通知和建立互動性方面取得了顯著的進步。通過 WebSocket,客戶端和服務器之間的雙向通信成為現代 Web 應用中不可或缺的一部分,為開發者提供了更多創造性和實時性的可能性。
SOAP 是 Web 服務的通信協議, 定義了 Web service 消息的格式。SOAP 編碼用于告知 SOAP 運行時環境如何從 Java 等數據結構轉化為 SOAP XML。
XML的可讀性和可擴展性使得SOAP能夠靈活地適應不同的應用場景,常見的 Web 服務規范包括:
SOAP 是協議獨立的,可以在各種網絡協議上運行,如HTTP、SMTP等。最常見的是在HTTP上使用SOAP,將SOAP消息封裝在HTTP協議中進行傳輸。SOAP 和 WSDL 指示 Web 服務及其客戶端之間的通信。SOAP支持多種消息交互模式,包括單向消息、請求-響應模式和異步消息。這使得它適用于不同的應用場景,從簡單的數據查詢到復雜的業務流程。
SOAP消息的傳輸可以使用安全協議,如HTTPS,以確保在網絡上傳輸時的機密性和完整性。此外,SOAP還可以與其他安全標準(如WS-Security)結合使用,提供更高級的安全性支持。
MQTT 是一種輕量級的、開放的消息隊列傳輸協議,設計用于在低帶寬、高延遲或不穩定網絡環境中進行設備間通信。其設計注重資源效率,使其成為在受限環境中運行的設備和應用程序的理想選擇。其協議頭部較小,通信開銷較小,適用于嵌入式系統和移動設備。
“ MQTT”中的“ MQ”是從 IBM 的 MQ (當時稱為 MQSeries)產品線派生出來的,其中 MQ 代表“消息隊列”。然而,盡管名稱如此,該協議并不使用消息隊列; 相反,它提供發布-訂閱消息: 設備在特定主題上發布消息,所有訂閱該主題的設備都接收該消息。它的主要應用包括向控制輸出發送消息,以及從傳感器節點讀取和發布數據。
MQTT 提供不同的服務質量(Quality of Service,QoS)級別,以滿足不同應用場景的需求。QoS級別包括至多一次(At most once)、至少一次(At least once)和只有一次(Exactly once)。
MQTT 支持持久性會話。客戶端可以選擇創建持久性會話,使得在客戶端斷開連接后,服務器能夠保留其訂閱信息。這有助于確保客戶端在重新連接時能夠接收到之前錯過的消息。
MQTT 支持基本的身份驗證和傳輸層安全性,但通常需要與其他安全機制結合使用,例如TLS/SSL。
總之,MQTT 是一種靈活、輕量級且易于實現的可靠而高效協議,特別適用于需要實時、可靠通信的物聯網和嵌入式系統。如果希望對物聯網通信協議有更多的了解,可以參閱筆者的拙作——《一書讀懂物聯網》。