مشکل متفاوت، یک راه حل: دروازه های API

Summarize this content to 400 words in Persian Lang
درود بر همکار توسعه دهندگان، اعم از با تجربه و تازه وارد.
آیا تا به حال متوجه شده اید که با API های مختلفی سروکار دارید که دارای نقاط پایانی متفاوتی هستند که منجر به سردرگمی در مورد اینکه فرانت اند باید به کدام یک از آنها دسترسی داشته باشد؟ شاید شما حتی به طور تصادفی تمام پاسخهای نقطه پایانی را در معرض دید فرانتاند قرار داده باشید.
راه حلی برای این مشکل وجود دارد: دروازه API.
API Gateway چیست؟
API Gateway سرویسی است که به مدیریت و ایمن سازی API ها (رابط برنامه نویسی برنامه) کمک می کند. این به عنوان یک درب ورودی برای API ها عمل می کند، درخواست ها را به خدمات باطن مناسب هدایت می کند، نسخه API، امنیت و کنترل دسترسی را مدیریت می کند، و همچنین ویژگی هایی مانند محدود کردن نرخ و حافظه پنهان را ارائه می دهد. به عبارت ساده تر، API Gateway ارتباط و تعامل بین برنامه های نرم افزاری مختلف را تسهیل می کند.
فرض کنید یک برنامه تجارت الکترونیک موبایل با ویژگی های مختلف مانند احراز هویت کاربر، جستجوی محصول و سفارش دارید. برای مدیریت API های این برنامه، می توانید از Amazon API Gateway استفاده کنید. با API Gateway، میتوانید نقاط پایانی API مختلف برای احراز هویت کاربر، جستجوی محصول و قرار دادن سفارش ایجاد کنید.
به عنوان مثال، می توانید یک نقطه پایانی API تنظیم کنید /auth برای احراز هویت کاربر که درخواست های دریافتی را برای تأیید اعتبار کاربر به یک تابع Lambda هدایت می کند. نقطه پایانی دیگر /products می تواند درخواست های جستجوی محصول را با اتصال به یک سرویس پشتیبان جداگانه که اطلاعات محصول را از پایگاه داده بازیابی می کند، رسیدگی کند.
علاوه بر این، اجازه دهید نسخهسازی API را با ایجاد نسخههای مختلف از APIها برای پشتیبانی از سازگاری به عقب پیادهسازی کنیم. API Gateway به شما این امکان را می دهد که به راحتی بدون ایجاد اختلال در عملکرد برنامه، نسخه ها را مدیریت کرده و بین آنها سوئیچ کنید.
علاوه بر این، میتوانید با تنظیم احراز هویت کلید API یا ادغام با نقشهای IAM برای کنترل دسترسی به APIهای خاص، امنیت را افزایش دهید. با ویژگیهایی مانند محدود کردن نرخ، میتوانید با محدود کردن تعداد درخواستهایی که کاربر میتواند در یک بازه زمانی خاص انجام دهد، از سوء استفاده از APIها جلوگیری کنید.
با استفاده از API Gateway در این سناریو، میتوانید ارتباط بین برنامه تجارت الکترونیک تلفن همراه خود و خدمات باطن را به طور مؤثر مدیریت و ایمن کنید و تجربهای یکپارچه و محافظت شده را برای کاربران خود تضمین کنید.
برخی از نمونه های پرکاربرد API Gateway عبارتند از AWS API Gateway، Azure API Management، Google Cloud Endpoints و Kong.
کار در حال انجام
پس از درک What، اجازه دهید به چگونه حرکت کنیم.
برای شروع، یک مخزن خالی ایجاد کنید
mkdir api-gateway
سپس npm را مقداردهی اولیه کنید
npm init
پس از تنظیم اولیه npm، اقدام به نصب بسته های لازم برای برنامه کنید
npm i express nodemon morgan express-rate-limit axios
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
ایجاد کنید index.js در مخزن فایل کنید و نتیجه نهایی شما باید شبیه این باشد.
از ایجاد تغییرات جزئی در داخل اطمینان حاصل کنید package.json فایل برای شروع nodemon. به صورت اختیاری، می توانید تنظیم کنید “type”: “module” برای ادامه با ES6، اگرچه رویکرد ما در CommonJs خواهد بود.
شروع با واردات ضروری،
const express = require(‘express’);
const axios = require(‘axios’);
const rateLimit = require(‘express-rate-limit’);
const morgan = require(‘morgan’);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
مقداردهی اولیه برنامه
const app = express();
const PORT = 3000;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
توجه: اگرچه CORS در این مثال استفاده نشده است، پیاده سازی آن ضروری است.
بیایید میان افزار را برای مورگان تنظیم کنیم
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.use(limiter);
app.use(morgan(‘combined’));
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
و برای میان افزارهای کنترل کننده خطا
const handleError = (err, req, res, next) => {
console.error(err);
res.status(500).send(‘Internal Server Error’);
};
app.use(handleError);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در این مثال، ما از APIهای ساختگی ارائه شده توسط JSONPlaceHolder و ReqRes استفاده خواهیم کرد.
JSONPlaceHolder
/posts – مجموعه ای از پست ها را واکشی کنید.
/comments – به مجموعه ای از نظرات دسترسی داشته باشید.
/albums – فهرستی از آلبوم ها را دریافت کنید.
/photos – یک سری عکس تهیه کنید.
/todos – خلاصه ای از کارها را دریافت کنید.
/users – ثبت نام کاربران را بازیابی کنید.
RegRes
/login – برای درخواست دسترسی به ورود استفاده می شود.
app.use(‘/api’, async (req, res, next) => { … }
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
در داخل اجرا خواهیم کرد try و catch روش
try{ … } catch (error) { … }
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
داخل try بیایید کار اصلی را شروع کنیم
let response;
const path = req.path;
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
if (
path.startsWith(“/posts”) ||
path.startsWith(“/comments”) ||
path.startsWith(“/albums”) ||
path.startsWith(“/photos”) ||
path.startsWith(“/todos”) ||
path.startsWith(“/users”)
) {
// Route to JSONPlaceholder
response = await axios.get(`https://jsonplaceholder.typicode.com${path}`);
} else if (path.startsWith(“/reqres-users”)) {
// Route to ReqRes
response = await axios.get(`https://reqres.in/api${path}`);
} else if (path.startsWith(“/reqres-login”)) {
// Handle ReqRes login
response = await axios.post(“https://reqres.in/api/login”, {
email: “eve.holt@reqres.in”,
password: “cityslicka”,
});
} else {
res.status(404).send(“Endpoint not found”);
return;
}
res.json(response.data);
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
و همین است. ما اجرای اولین API Gateway خود را به پایان رساندیم.
کد کلی باید به این شکل باشد.
const express = require(“express”);
const axios = require(“axios”);
const rateLimit = require(“express-rate-limit”);
const morgan = require(“morgan”);
const app = express();
const PORT = 3000;
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
});
app.use(limiter);
app.use(morgan(“combined”));
// Error Handling Middleware
const handleError = (err, req, res, next) => {
console.error(err);
res.status(500).send(“Internal Server Error”);
};
app.use(handleError);
// Unified API endpoint
app.use(“/api”, async (req, res, next) => {
try {
let response;
const path = req.path;
if (
path.startsWith(“/posts”) ||
path.startsWith(“/comments”) ||
path.startsWith(“/albums”) ||
path.startsWith(“/photos”) ||
path.startsWith(“/todos”) ||
path.startsWith(“/users”)
) {
// Route to JSONPlaceholder
response = await axios.get(`https://jsonplaceholder.typicode.com${path}`);
} else if (path.startsWith(“/reqres-users”)) {
// Route to ReqRes
response = await axios.get(`https://reqres.in/api${path}`);
} else if (path.startsWith(“/reqres-login”)) {
// Handle ReqRes login
response = await axios.post(“https://reqres.in/api/login”, {
email: “eve.holt@reqres.in”,
password: “cityslicka”,
});
} else {
res.status(404).send(“Endpoint not found”);
return;
}
res.json(response.data);
} catch (error) {
next(error);
}
});
app.listen(PORT, () => {
console.log(`API Gateway running on port ${PORT}`);
});
وارد حالت تمام صفحه شوید
از حالت تمام صفحه خارج شوید
تست و نتایج
وقت آن است که نقطه پایانی API خود را آزمایش کنیم، من از Insomnia استفاده میکنم، اما شما میتوانید از هر کدام از انتخابهای خود استفاده کنید، مطمئناً، بیایید ادامه دهیم و درخواستی را به نقطه پایانی API ارسال کنیم تا ببینیم آیا همه چیز همانطور که انتظار میرود کار میکند یا خیر.
به هک کردن ادامه دهید!
درود بر همکار توسعه دهندگان، اعم از با تجربه و تازه وارد.
آیا تا به حال متوجه شده اید که با API های مختلفی سروکار دارید که دارای نقاط پایانی متفاوتی هستند که منجر به سردرگمی در مورد اینکه فرانت اند باید به کدام یک از آنها دسترسی داشته باشد؟ شاید شما حتی به طور تصادفی تمام پاسخهای نقطه پایانی را در معرض دید فرانتاند قرار داده باشید.
راه حلی برای این مشکل وجود دارد: دروازه API.
API Gateway چیست؟
API Gateway سرویسی است که به مدیریت و ایمن سازی API ها (رابط برنامه نویسی برنامه) کمک می کند. این به عنوان یک درب ورودی برای API ها عمل می کند، درخواست ها را به خدمات باطن مناسب هدایت می کند، نسخه API، امنیت و کنترل دسترسی را مدیریت می کند، و همچنین ویژگی هایی مانند محدود کردن نرخ و حافظه پنهان را ارائه می دهد. به عبارت ساده تر، API Gateway ارتباط و تعامل بین برنامه های نرم افزاری مختلف را تسهیل می کند.
فرض کنید یک برنامه تجارت الکترونیک موبایل با ویژگی های مختلف مانند احراز هویت کاربر، جستجوی محصول و سفارش دارید. برای مدیریت API های این برنامه، می توانید از Amazon API Gateway استفاده کنید. با API Gateway، میتوانید نقاط پایانی API مختلف برای احراز هویت کاربر، جستجوی محصول و قرار دادن سفارش ایجاد کنید.
به عنوان مثال، می توانید یک نقطه پایانی API تنظیم کنید /auth
برای احراز هویت کاربر که درخواست های دریافتی را برای تأیید اعتبار کاربر به یک تابع Lambda هدایت می کند. نقطه پایانی دیگر /products
می تواند درخواست های جستجوی محصول را با اتصال به یک سرویس پشتیبان جداگانه که اطلاعات محصول را از پایگاه داده بازیابی می کند، رسیدگی کند.
علاوه بر این، اجازه دهید نسخهسازی API را با ایجاد نسخههای مختلف از APIها برای پشتیبانی از سازگاری به عقب پیادهسازی کنیم. API Gateway به شما این امکان را می دهد که به راحتی بدون ایجاد اختلال در عملکرد برنامه، نسخه ها را مدیریت کرده و بین آنها سوئیچ کنید.
علاوه بر این، میتوانید با تنظیم احراز هویت کلید API یا ادغام با نقشهای IAM برای کنترل دسترسی به APIهای خاص، امنیت را افزایش دهید. با ویژگیهایی مانند محدود کردن نرخ، میتوانید با محدود کردن تعداد درخواستهایی که کاربر میتواند در یک بازه زمانی خاص انجام دهد، از سوء استفاده از APIها جلوگیری کنید.
با استفاده از API Gateway در این سناریو، میتوانید ارتباط بین برنامه تجارت الکترونیک تلفن همراه خود و خدمات باطن را به طور مؤثر مدیریت و ایمن کنید و تجربهای یکپارچه و محافظت شده را برای کاربران خود تضمین کنید.
برخی از نمونه های پرکاربرد API Gateway عبارتند از AWS API Gateway، Azure API Management، Google Cloud Endpoints و Kong.
کار در حال انجام
پس از درک What، اجازه دهید به چگونه حرکت کنیم.
برای شروع، یک مخزن خالی ایجاد کنید
mkdir api-gateway
سپس npm را مقداردهی اولیه کنید
npm init
پس از تنظیم اولیه npm، اقدام به نصب بسته های لازم برای برنامه کنید
npm i express nodemon morgan express-rate-limit axios
ایجاد کنید index.js
در مخزن فایل کنید و نتیجه نهایی شما باید شبیه این باشد.
از ایجاد تغییرات جزئی در داخل اطمینان حاصل کنید package.json
فایل برای شروع nodemon
. به صورت اختیاری، می توانید تنظیم کنید "type": "module"
برای ادامه با ES6، اگرچه رویکرد ما در CommonJs خواهد بود.
شروع با واردات ضروری،
const express = require('express');
const axios = require('axios');
const rateLimit = require('express-rate-limit');
const morgan = require('morgan');
مقداردهی اولیه برنامه
const app = express();
const PORT = 3000;
توجه: اگرچه CORS در این مثال استفاده نشده است، پیاده سازی آن ضروری است.
بیایید میان افزار را برای مورگان تنظیم کنیم
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.use(limiter);
app.use(morgan('combined'));
و برای میان افزارهای کنترل کننده خطا
const handleError = (err, req, res, next) => {
console.error(err);
res.status(500).send('Internal Server Error');
};
app.use(handleError);
در این مثال، ما از APIهای ساختگی ارائه شده توسط JSONPlaceHolder و ReqRes استفاده خواهیم کرد.
-
JSONPlaceHolder
-
/posts
– مجموعه ای از پست ها را واکشی کنید. -
/comments
– به مجموعه ای از نظرات دسترسی داشته باشید. -
/albums
– فهرستی از آلبوم ها را دریافت کنید. -
/photos
– یک سری عکس تهیه کنید. -
/todos
– خلاصه ای از کارها را دریافت کنید. -
/users
– ثبت نام کاربران را بازیابی کنید.
-
-
RegRes
-
/login
– برای درخواست دسترسی به ورود استفاده می شود.
-
app.use('/api', async (req, res, next) => { ... }
در داخل اجرا خواهیم کرد try
و catch
روش
try{ ... } catch (error) { ... }
داخل try
بیایید کار اصلی را شروع کنیم
let response;
const path = req.path;
if (
path.startsWith("/posts") ||
path.startsWith("/comments") ||
path.startsWith("/albums") ||
path.startsWith("/photos") ||
path.startsWith("/todos") ||
path.startsWith("/users")
) {
// Route to JSONPlaceholder
response = await axios.get(`https://jsonplaceholder.typicode.com${path}`);
} else if (path.startsWith("/reqres-users")) {
// Route to ReqRes
response = await axios.get(`https://reqres.in/api${path}`);
} else if (path.startsWith("/reqres-login")) {
// Handle ReqRes login
response = await axios.post("https://reqres.in/api/login", {
email: "eve.holt@reqres.in",
password: "cityslicka",
});
} else {
res.status(404).send("Endpoint not found");
return;
}
res.json(response.data);
و همین است. ما اجرای اولین API Gateway خود را به پایان رساندیم.
کد کلی باید به این شکل باشد.
const express = require("express");
const axios = require("axios");
const rateLimit = require("express-rate-limit");
const morgan = require("morgan");
const app = express();
const PORT = 3000;
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
});
app.use(limiter);
app.use(morgan("combined"));
// Error Handling Middleware
const handleError = (err, req, res, next) => {
console.error(err);
res.status(500).send("Internal Server Error");
};
app.use(handleError);
// Unified API endpoint
app.use("/api", async (req, res, next) => {
try {
let response;
const path = req.path;
if (
path.startsWith("/posts") ||
path.startsWith("/comments") ||
path.startsWith("/albums") ||
path.startsWith("/photos") ||
path.startsWith("/todos") ||
path.startsWith("/users")
) {
// Route to JSONPlaceholder
response = await axios.get(`https://jsonplaceholder.typicode.com${path}`);
} else if (path.startsWith("/reqres-users")) {
// Route to ReqRes
response = await axios.get(`https://reqres.in/api${path}`);
} else if (path.startsWith("/reqres-login")) {
// Handle ReqRes login
response = await axios.post("https://reqres.in/api/login", {
email: "eve.holt@reqres.in",
password: "cityslicka",
});
} else {
res.status(404).send("Endpoint not found");
return;
}
res.json(response.data);
} catch (error) {
next(error);
}
});
app.listen(PORT, () => {
console.log(`API Gateway running on port ${PORT}`);
});
تست و نتایج
وقت آن است که نقطه پایانی API خود را آزمایش کنیم، من از Insomnia استفاده میکنم، اما شما میتوانید از هر کدام از انتخابهای خود استفاده کنید، مطمئناً، بیایید ادامه دهیم و درخواستی را به نقطه پایانی API ارسال کنیم تا ببینیم آیا همه چیز همانطور که انتظار میرود کار میکند یا خیر.
به هک کردن ادامه دهید!