APIGit
2024-11-15
創建模擬 API 是軟體開發的一個重要方面,無論是出於測試目的還是快速原型設計。 APIGIT MockServer 透過包裝 Express.js 提供簡化的解決方案,提供簡化的環境來定義模擬伺服器行為,而無需手動設定和設定 Express 應用程式。
APIGIT MockServer 在 Node.js 沙箱中運行,利用 Express.js 應用程式來簡化模擬 API 的創建。它可以透過簡單的定義快速開發和處理各種 HTTP 請求。在本介紹中,我們將探索 MockServer 的功能,重點介紹其功能,並示範如何透過實際範例快速入門。
lodash
, moment
, faker
,以及更多預先安裝的內容,簡化了動態模擬響應的創建。MockServer 的工作原理是允許您使用定義 API 路由 mock
目的。 嘲笑 是一個全球性的 Express.js 應用程式 由底層 apigit 模擬伺服器框架自動建立。您可以依照 Express.js 文件中提供的指南,使用 mock.[method] 定義路由。
以下是 MockServer 如何簡化 API 建立的概述:
mock.[method](...)
定義路由和請求處理程序。req
和 res
處理 HTTP 請求和回應。以下範例展示了使用 MockServer 建立路由是多麼容易:
mock.get("/user/:name", function (req, res) {
return res.status(200).send("hello" + req.params.name);
});
mock.post('/test-urlencoded', (req, res) => {
console.log('Received x-www-form-urlencoded data:', req.body);
res.status(200).send({ message: 'Received x-www-form-urlencoded data', data: req.body });
});
mock.get('/testauth', exampelAuthMiddleware, (req, res) => {
res.status(200).send('This route is to deomostrate auth through middleware ');
});
mock.get('/testmd2', firstMiddleware, secondMiddleware, (req, res) => {
res.status(200).send('This route has multiple middlewares!');
});
// !!!== mock.define is deprecated and provided for compatibility only. Please use mock.[method] instead, as it follows the native Express.js approach. !!!
mock.delete("/user/:name", function(req, res) {
// handle req
res.status(200).send("success");
});
請注意 mock.define()
已被棄用,僅出於相容性目的而提供。我們建議使用 mock.[method]
相反,因為它與原生一致 Express.js
方法。
就像在 Express.js 中一樣,您可以使用中間件在請求到達最終路由處理程序之前處理請求:
const exampelAuthMiddleware = (req, res, next) => {
const authHeader = req.headers['authorization'];
if (!authHeader) {
return res.status(401).send('Authorization header missing');
}
const token = authHeader.split(' ')[1];
if (!token) {
return res.status(401).send('Token missing');
}
try {
const SECRET_KEY = 'your-secret-key';
const decoded = jwt.verify(token, SECRET_KEY);
req.user = decoded;
next();
} catch (err) {
return res.status(403).send('Invalid token');
}
};
function firstMiddleware(req, res, next) {
console.log('First middleware');
next();
}
function secondMiddleware(req, res, next) {
console.log('Second middleware');
next();
}
mock.use((req, res, next) => {
console.log("middware for all routes");
next();
});
mock.get('/testauth', exampelAuthMiddleware, (req, res) => {
res.status(200).send('This route is to deomostrate auth through middleware ');
});
mock.get('/testmd2', firstMiddleware, secondMiddleware, (req, res) => {
res.status(200).send('This route has multiple middlewares!');
});
這 mock.use()
函數可用於為所有路由或特定路徑定義中間件,就像在 Express 應用程式中一樣。
MockServer 提供了一種使用標準 Express.js 約定與請求和回應互動的簡單方法。以下是常見任務的一些範例:
mock.get('/repository/:user/:repo', (req, res) => {
const { user, repo } = req.params;
res.json({
message: 'Repository Details',
user: user,
repo: repo
});
});
mock.get('/search', (req, res) => {
const { keyword, page, limit } = req.query;
res.json({
message: 'Search Parameters Received',
keyword: keyword || 'none',
page: page ? parseInt(page, 10) : 1,
limit: limit ? parseInt(limit, 10) : 10
});
});
mock.get('/not-found', (req, res) => {
res.status(404).json({
message: 'Resource not found',
code: 404
});
});
mock.get('/single-header', (req, res) => {
res.set('Content-Type', 'application/json');
res.set('X-Custom-Header', ['value1', 'value2']);
res.json({ message: 'Headers set successfully!' });
});
MockServer 預先安裝了流行的 JavaScript 庫,因此您可以直接在模擬定義中使用它們:
const _ = require('lodash');
const moment = require('moment');
const { faker } = require('@faker-js/faker');
mock.get('/test-libs', (req, res) => {
const randomUser = {
id: faker.datatype.uuid(),
name: faker.name.findName(),
email: faker.internet.email()
};
res.json({
currentDate: moment().format(),
activeUsers: _.filter([{ active: true }, { active: false }], { active: true }),
randomUser: randomUser
});
});
這些程式庫可協助您輕鬆建立豐富的動態回應,無需額外安裝。如果您需要未列出的程式庫,請聯絡 APIGIT,我們將快速評估並新增它。支援的庫包括:
MockServer 提供了一個 state
對象,它允許您在請求之間存儲和檢索數據,從而可以輕鬆模擬持久狀態:
// Create a stateful list of users
state.users = state.users || [];
mock.post('/users', (req, res) => {
if (!req.body.username) {
return res.status(400).json({ status: "error", details: "Missing username" });
}
state.users.push(req.body);
return res.status(200).json({ status: "ok" });
});
為了保持更乾淨、更有組織的程式碼,MockServer 支援以模組化的方式將模擬腳本拆分為多個文件,類似於日常開發實踐。通常,您會有一個 main.js
定義所有路由的文件,然後需要來自單獨文件的處理程序定義。這允許您為路由處理程序建立可重複使用、結構良好的模組,從而保持程式碼庫的可維護性。
例如:
module.exports
。// main.js
// Require handler modules at the top
const { userPostHandler, userDeleteHandler } = require('./handlers/userHandlers');
// Define routes
mock.post('/user/:name', userPostHandler);
mock.delete('/user/:name', userDeleteHandler);
module.exports
將它們一起導出。// handlers/userHandlers.js
function userPostHandler(req, res) {
res.status(404).send('User not found');
}
function userDeleteHandler(req, res) {
res.status(200).send('User deleted successfully');
}
module.exports = {
userPostHandler,
userDeleteHandler
};
這種模組化方法可以幫助您邏輯地組織路線並實現跨不同模擬專案的可重複使用性。
MockServer 透過在沙盒環境中利用 Express.js 的強大功能,簡化了設定模擬 API 的流程。憑藉內建函式庫、簡單的路由定義、中間件支援和狀態資料管理,對於希望快速且有效率地建立模擬 API 的開發人員來說,它是一個方便的解決方案。
無論您是初學者還是經驗豐富的開發人員,MockServer 都提供了模擬 API 行為所需的工具,而無需設定完整的 Express 伺服器的開銷。試試一下,讓您的 API 測試和原型設計更順利、更有效率。