※ REST API 和 Apollo GraphQL Server 的區別:
- 資料獲取方式:
- REST API:每個資源都有一個固定的 URL,並且通過 HTTP 方法(如 GET、POST、PUT、DELETE)來操作這些資源。伺服器決定返回的資料結構。
- GraphQL:使用單一的端點(通常是 /graphql),客戶端可以根據需求查詢具體的資料。客戶端決定需要哪些資料,伺服器根據查詢返回相應的資料。
- 資料結構:
- REST API:資料結構是由伺服器定義的,客戶端只能接受伺服器返回的資料格式。
- GraphQL:資料結構是由客戶端定義的,客戶端可以指定需要的資料欄位,避免過多或過少的資料傳輸。
- 效能與快取:
- REST API:可以利用 HTTP 快取機制來提高效能,特別是對於 GET 請求。
- GraphQL:由於使用單一端點,無法直接利用 HTTP 快取,但可以使用客戶端快取工具(如 Apollo Client)來實現快取。
※ 何時使用 REST API:
- 簡單且固定的資料結構:如果資料結構相對簡單且不會頻繁變動,REST API 是一個不錯的選擇。
- 傳統應用:許多現有的應用和工具已經與 REST API 集成,這使得它在某些情況下更容易實施。
- HTTP 快取:REST API 可以利用 HTTP 的內建快取機制來提高效能,特別是對於靜態資源。
※ 何時使用 Apollo GraphQL Server:
- 複雜且動態的資料需求:當應用需要從多個資源中獲取資料,並且這些資料的結構可能會頻繁變動時,GraphQL 提供了更大的靈活性。
- 減少資料傳輸量:客戶端可以根據需求查詢具體的資料欄位,避免過多或過少的資料傳輸。
- 客戶端快取:雖然 GraphQL 無法直接利用 HTTP 的內建快取機制,但可以使用 Apollo Client 這樣具有查詢快取、快取更新、快取策略的工具來實現客戶端快取。
※ 整合 REST API 和 GraphQL常見的方法:
使用 GraphQL 作為中介層
你可以使用 GraphQL 作為中介層,將多個 REST API 整合到一個 GraphQL 端點。這樣,客戶端只需發送一個 GraphQL 查詢,就能獲取來自多個 REST API 的資料。這種方法可以減少 API 請求數量,提升效能。
2. 在 GraphQL 中調用 REST API
在 GraphQL 解析器中,你可以調用 REST API 來獲取資料。這樣,GraphQL 查詢會觸發對 REST API 的請求,並將結果返回給客戶端。這種方法適合需要從現有 REST API 獲取資料的情況。
3. 混合使用 REST API 和 GraphQL
在同一個應用中,你可以同時使用 REST API 和 GraphQL。比如,對於簡單的資料操作(如 CRUD 操作),可以使用 REST API;而對於複雜的資料查詢,則使用 GraphQL。這樣可以根據具體需求選擇最合適的技術。
※ Express 伺服器和Apollo GraphQL 伺服器區別:
Express 伺服器:
app.listen(3000, () => {
console.log('express app listen on port 3000')
})
這段代碼使用 Express 框架來啟動一個 HTTP 伺服器,並將其綁定到端口 3000。Express 是一個用於構建 Web 應用程式和 API 的 Node.js 框架。
Apollo GraphQL 伺服器:
server.listen(8891, () => {
console.log('Apollo GraphQL Server run on port 8891')
});
這段代碼使用 Apollo Server 來啟動一個 GraphQL 伺服器,並將其綁定到端口 8891。Apollo Server 是一個專門用於構建 GraphQL API 的伺服器框架。
※ Express 和Apollo GraphQL 在同一個伺服器上運行:
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
const app = express();
app.get('/api', (req, res) => {
res.send('Hello from REST API!');
});
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => 'Hello from GraphQL!',
},
};
const server = new ApolloServer({ typeDefs, resolvers });
server.start().then(() => {
server.applyMiddleware({ app });
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
console.log(`GraphQL endpoint: http://localhost:3000${server.graphqlPath}`);
});
});
※ 同時啟動Express 和Apollo GraphQL 伺服器功用:
- 即時更新效果:如果想在瀏覽器中即時看到網頁的變化,通常會啟動一個 HTTP 伺服器(例如使用 Express)。就可以在本地開發環境中測試和查看網頁應用程式。
- 內部開發和維護 API:如果想開發和維護 GraphQL API,則需要啟動一個 GraphQL 伺服器(例如使用 Apollo Server)。就可以使用工具如 Apollo Studio 來查看和管理 GraphQL Schema、查詢性能、錯誤追蹤等。
這兩者並不是互斥的。可以在同一個應用中同時啟動 HTTP 伺服器和 GraphQL 伺服器,這樣既可以即時查看網頁變化,也可以開發和維護你的 API。
※ GraphQL 特別適合處理以下幾種類型的複雜資料查詢:
- 多層次關聯數據:當需要查詢多個相關數據時,GraphQL 可以在一次請求中獲取所有需要的數據。例如,查詢一個用戶及其所有文章和每篇文章的評論。
- 客製化數據需求:當不同的客戶端需要不同的數據時,GraphQL 可以讓客戶端指定他們需要的數據,避免過多或過少的數據傳輸。例如,移動應用和桌面應用可能需要不同的數據格式。
- 多數據源整合:當需要從多個數據源獲取數據時,GraphQL 可以將這些數據源整合在一起,提供統一的查詢接口。例如,從資料庫、第三方 API 和內部服務中獲取數據。
- 動態查詢:當查詢需求經常變化時,GraphQL 可以讓開發者靈活地定義和修改查詢,而不需要改變後端代碼。例如,根據用戶的不同需求動態生成查詢。
- 減少多次請求:當需要多次請求才能獲取所有需要的數據時,GraphQL 可以在一次請求中獲取所有數據,減少網絡延遲和資源消耗。例如,查詢一個產品及其相關的評論和評分。
※ REST API 的常見應用:
- 數據檢索和操作:這是最基本的功能,包括使用 GET、POST、PUT 和 DELETE 方法來檢索和操作數據。
- 身份驗證和授權:REST API 可以用來實現用戶身份驗證和授權,確保只有授權用戶才能訪問特定資源。
- 文件上傳和下載:REST API 可以用來處理文件的上傳和下載,這在許多應用中非常常見。
- 通知和消息推送:REST API 可以用來實現即時通知和消息推播,這對於即時通訊應用和通知系統非常有用。
- 數據同步:REST API 可以用來在不同系統之間同步數據,確保數據的一致性和最新性。
- 第三方整合:REST API 可以用來與第三方服務進行整合,例如支付平台、地圖服務和社群媒體平台。
※ 專業後端工程師需具備的技能:
- REST API
- Apollo GraphQL Server
原因:
有時候一個項目可能需要同時使用 REST API 和 GraphQL,掌握這兩種技術可以更好地整合和實現。