
แอปส่วนใหญ่ไม่ได้คุยกับเซิร์ฟเวอร์ตัวเดียว เบื้องหลังมีทั้งบริการผู้ใช้ เมนู ออเดอร์ จ่ายเงิน และแจ้งเตือน ถ้าแอปต้องจำที่อยู่ของทุกตัว และทุกตัวต้องเช็กคีย์เองกันคนยิงรัวเอง ระบบจะยุ่งและพลาดง่ายมาก API Gateway คือคำตอบของปัญหานี้ เป็นประตูบานเดียวที่ตั้งไว้หน้าบริการทั้งหมด
บทความนี้เริ่มจากศูนย์ ตั้งแต่ API คืออะไร Gateway ทำอะไรทีละด่าน แล้วลงมือสร้างประตูจำลองในเครื่องตัวเองด้วย Node.js ไม่ต้องติดตั้งไลบรารีเพิ่ม ไม่ต้องสมัครบริการไหน แล้วลองยิงคำขอจนเห็นรหัส 200, 401, 429, 404 และ 502 ด้วยตาตัวเอง
จบบทความนี้คุณจะ:
- อธิบายได้ว่า API คืออะไร และคำขอกับคำตอบหน้าตาเป็นยังไง
- รู้ว่า API Gateway ทำหน้าที่อะไร และเมื่อไรถึงคุ้มที่จะมี
- เข้าใจสามด่านหลักของประตู คือเช็กบัตร จำกัดจำนวน และชี้ทาง
- สร้างบริการหลังบ้านกับประตูจำลองด้วย Node.js แล้วยิงคำขอทดสอบได้เอง
- แก้ค่าในประตูเอง และรู้จัก Gateway ตัวจริงอย่าง Amazon API Gateway กับ Kong
API คืออะไร
API คือช่องทางที่โปรแกรมหนึ่งใช้ขอข้อมูลหรือสั่งงานอีกโปรแกรม นึกถึงการสั่งอาหารผ่านพนักงานครับ เราไม่ต้องเข้าครัวเอง แค่บอกว่าอยากได้อะไร แล้วรอของมา
| เรื่อง | ในร้านอาหาร | ในแอป |
|---|---|---|
| คนขอ | ลูกค้า | แอปมือถือหรือเว็บ (client) |
| คำขอ | "ขอดูเมนูหน่อย" | GET /menu |
| คนตอบ | ครัว | เซิร์ฟเวอร์ (server) |
| คำตอบ | เมนูที่ยื่นให้ | ข้อมูล JSON พร้อมรหัสสถานะ |
หน้าตาของคำขอกับคำตอบจริงๆ เป็นแบบนี้
GET /menu
x-api-key: devkub-123200 OK
{ "name": "ข้าวมันไก่", "price": 50 }GETคือ "ขอดู"/menuคือ path บอกว่าขออะไรx-api-keyคือ header ที่แนบไปด้วย ในที่นี้คือคีย์ยืนยันตัว200คือรหัสบอกผล ตัวเลขขึ้นต้นด้วย 2 แปลว่าสำเร็จ ขึ้นต้นด้วย 4 แปลว่าฝั่งคนขอผิด และขึ้นต้นด้วย 5 แปลว่าฝั่งเซิร์ฟเวอร์มีปัญหา (อ่านเรื่องรหัสสถานะแบบละเอียดได้ในบทความ HTTP status code)
สรุปสั้นๆ API ก็คือเมนูที่บอกว่าขออะไรได้บ้าง และต้องขอยังไง
ศัพท์ที่ต้องรู้
| คำ | ความหมายแบบมือใหม่ | เทียบกับ |
|---|---|---|
| Client | ตัวที่ส่งคำขอ เช่น แอปหรือเว็บ | คนที่เดินเข้าตึก |
| Server / Service | โปรแกรมที่ตอบคำขอ หนึ่งตัวทำงานหนึ่งเรื่อง | ห้องแต่ละห้อง |
| Endpoint / Path | ที่อยู่ของงาน เช่น /menu หรือ /pay | ป้ายชื่อห้อง |
| Method | GET ขอดู, POST ส่งของใหม่, PUT แก้, DELETE ลบ | บอกว่ามาทำอะไร |
| Header | ข้อมูลที่แนบไปกับคำขอ เช่น คีย์ | บัตรที่ถือมา |
| JSON | รูปแบบข้อมูลแบบ {"ชื่อ": ค่า} | ข้อความที่ส่งกลับ |
| API key / Token | รหัสยืนยันว่าเป็นใคร | บัตรผ่าน |
| Rate limit | จำนวนคำขอสูงสุดต่อช่วงเวลา | ด่านจำกัดจำนวน |
| Routing | เลือกว่าคำขอนี้ไปห้องไหน | ด่านชี้ทาง |
| Port | เลขช่องของโปรแกรมในเครื่อง เช่น 3000 | เลขประตู |
| localhost | เครื่องของคุณเอง | ตึกจำลองในเครื่อง |
รหัสสถานะที่จะได้เห็นในแล็บนี้มี 5 ตัว
| รหัส | แปลว่า | เกิดตอนไหนในแล็บ |
|---|---|---|
| 200 OK | สำเร็จ | ผ่านครบสามด่าน |
| 401 Unauthorized | ยืนยันตัวไม่ผ่าน | ไม่มีคีย์ หรือคีย์ผิด |
| 429 Too Many Requests | ขอถี่เกินไป | เกิน 5 ครั้งใน 10 วินาที |
| 404 Not Found | ไม่มีสิ่งที่ขอ | path ไม่มีในตารางห้อง |
| 502 Bad Gateway | ประตูส่งต่อแล้ว แต่ห้องไม่ตอบ | ปิดห้องหลังบ้านไว้ |
API Gateway คืออะไร
API Gateway คือโปรแกรมที่ตั้งไว้ด้านหน้าบริการทั้งหมด คำขอทุกอันต้องเข้าที่นี่ก่อน แล้วมันส่งต่อให้บริการที่ถูกต้อง หน้าเว็บของ Amazon API Gateway อธิบายว่า API เป็นเหมือน "front door" ของแอป คือประตูหน้าที่ทุกคนต้องผ่าน

| เรื่อง | ไม่มี Gateway | มี Gateway |
|---|---|---|
| แอปต้องรู้ | ที่อยู่ของทุกบริการ | ที่อยู่เดียว |
| เช็กคีย์ | ทุกบริการเขียนเอง | ทำที่ประตูครั้งเดียว |
| กันคนยิงรัว | ต้องทำทุกตัว | ทำที่ประตูครั้งเดียว |
| ย้ายหรือแยกบริการ | ต้องแก้แอป | แก้ตารางชี้ทางที่ประตู |
โปรเจกต์เล็กยังไม่ต้องมีก็ได้ ถ้ามีเซิร์ฟเวอร์ตัวเดียว Gateway อาจเป็นภาระเกินจำเป็น มันเริ่มคุ้มเมื่อมีหลายบริการ หรือเมื่อเปิด API ให้คนนอกใช้
สามด่านทำงานยังไง
คำขอหนึ่งอันเดินผ่านประตูแบบนี้
- แอปส่งคำขอมาที่ประตู เช่น
GET /menuพร้อม headerx-api-key - ด่าน 1 เช็กบัตร (authentication) ดูว่ามีคีย์และคีย์ถูกไหม ไม่ผ่านตอบ 401 ทันที ไม่ไปถึงห้องเลย
- ด่าน 2 จำกัดจำนวน (rate limiting) นับว่าคีย์นี้ขอมากี่ครั้งในช่วงเวลาหนึ่ง เกินลิมิตตอบ 429 ให้รอก่อน กันระบบล่มจากคนยิงรัว
- ด่าน 3 ชี้ทาง (routing) ดู path แล้วเปิดตารางว่าต้องไปห้องไหน
/menuไปห้องเมนู/payไปห้องจ่ายเงิน ไม่มีในตารางตอบ 404 - ส่งต่อแล้วรับคำตอบกลับ ประตูส่งคำขอให้ห้อง รอคำตอบ แล้วยื่นคืนให้แอป แอปไม่ต้องรู้เลยว่าห้องอยู่ตรงไหน

ทำไมต้องเช็กบัตรก่อน เพราะคำขอที่ไม่มีบัตรไม่ควรเปลืองแรงนับหรือส่งต่อ ตีกลับได้เร็วที่สุดยิ่งดี ของจริงยังทำอย่างอื่นได้อีก เช่น เก็บ log แคชคำตอบ หรือแปลงรูปแบบข้อมูล แต่สามด่านนี้คือหัวใจที่ช่วยให้เห็นภาพรวม
รหัสอาจต่างกันในแต่ละบริการ 401 และ 429 เป็นรหัส HTTP มาตรฐาน (401 อยู่ใน RFC 9110 และ 429 อยู่ใน RFC 6585) แต่แต่ละบริการตั้งได้ต่างกัน เช่น บางเจ้าตอบ 403 ตอนคีย์ผิด ให้ดูเอกสารของเจ้าที่ใช้
เตรียมเครื่อง
แล็บนี้ใช้ได้ทั้ง Windows และ macOS ต้องมีแค่ 2 อย่าง
1. Node.js เข้า nodejs.org โหลดรุ่น LTS แล้วติดตั้งตามปกติ (Windows ใช้ไฟล์ .msi ส่วน macOS ใช้ไฟล์ .pkg) จากนั้นปิดแล้วเปิดหน้าต่างคำสั่งใหม่ เช็กด้วย
node -vv26.x.xเลขรุ่นต่างไปได้ ขอแค่ขึ้นเลข ณ ต.ค. 2026 รุ่น LTS ล่าสุดคือ v26
2. curl ตัวยิงคำขอ มีมาในเครื่องอยู่แล้วทั้ง Windows 10/11 และ macOS
curl.exe --versioncurl --versioncurl 8.x.x ...บน Windows PowerShell ให้พิมพ์ curl.exe เสมอ ใน Windows PowerShell 5.1 คำว่า
curlเฉยๆ คือชื่อเล่นของคำสั่งอื่น (Invoke-WebRequest) ที่รับตัวเลือกไม่เหมือนกัน พิมพ์curl.exeจะได้ curl ตัวจริงเสมอ
สุดท้ายสร้างโฟลเดอร์ฝึก
mkdir gateway-lab
cd gateway-labเปิดโฟลเดอร์นี้ด้วยโปรแกรมแก้ไขข้อความ เช่น VS Code, Notepad หรือ TextEdit (ตั้งเป็น Plain text) แล้วบันทึกไฟล์เป็น UTF-8 ทุกครั้ง
สร้างห้องหลังบ้าน
ไฟล์แรกเปิดห้อง 3 ห้องที่พอร์ต 4001, 4002 และ 4003 แต่ละห้องตอบ JSON ของตัวเอง ใช้แค่โมดูล http ที่มากับ Node.js ไม่ต้องติดตั้งอะไรเพิ่ม
// ห้องหลังบ้าน 3 ห้อง: เมนู ออเดอร์ จ่ายเงิน
const http = require('http');
const room = (port, data) =>
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
res.end(JSON.stringify(data));
}).listen(port, () => console.log('ห้องพร้อมที่พอร์ต', port));
room(4001, {room: 'menu', items: [{name: 'ข้าวมันไก่', price: 50}]});
room(4002, {room: 'orders', orders: []});
room(4003, {room: 'pay', status: 'ready'});node services.jsห้องพร้อมที่พอร์ต 4001
ห้องพร้อมที่พอร์ต 4002
ห้องพร้อมที่พอร์ต 4003เห็นสามบรรทัดนี้แปลว่าห้องเปิดแล้ว ปล่อยหน้าต่างนี้ไว้ อย่าปิด ในระบบจริงแต่ละห้องคือบริการแยกกัน อาจอยู่คนละเครื่อง ในแล็บเราจำลองด้วยการใช้คนละพอร์ต
สร้างประตู
ไฟล์ที่สองคือตัวประตู มีครบทั้งสามด่าน
// ประตูหน้า: เช็กบัตร -> จำกัดจำนวน -> ชี้ทาง
const http = require('http');
const KEY = 'devkub-123'; // คีย์ที่ยอมให้ผ่าน
const LIMIT = 5; // ได้กี่ครั้ง
const WINDOW_MS = 10000; // ต่อกี่มิลลิวินาที (10 วินาที)
const ROUTES = { // path -> ห้องไหน
'/menu': 4001,
'/orders': 4002,
'/pay': 4003,
};
const hits = {}; // นับคำขอของแต่ละคีย์
http.createServer((req, res) => {
const send = (code, body) => {
res.writeHead(code, {'Content-Type': 'application/json; charset=utf-8'});
res.end(JSON.stringify(body));
console.log(req.method, req.url, '->', code);
};
// ด่าน 1 เช็กบัตร
const key = req.headers['x-api-key'];
if (key !== KEY) return send(401, {error: 'ไม่มีคีย์ หรือคีย์ผิด'});
// ด่าน 2 จำกัดจำนวน
const now = Date.now();
hits[key] = (hits[key] || []).filter((t) => now - t < WINDOW_MS);
if (hits[key].length >= LIMIT) return send(429, {error: 'รัวเกินไป รอก่อน'});
hits[key].push(now);
// ด่าน 3 ชี้ทาง
const port = ROUTES[req.url];
if (!port) return send(404, {error: 'ไม่มีห้องนี้'});
http.get({port, path: '/'}, (r) => {
let data = '';
r.on('data', (c) => (data += c));
r.on('end', () => send(r.statusCode, JSON.parse(data)));
}).on('error', () => send(502, {error: 'ห้องหลังบ้านไม่ตอบ'}));
}).listen(3000, () => console.log('ประตูเปิดที่ http://localhost:3000'));เปิดหน้าต่างคำสั่งใหม่ เข้าโฟลเดอร์ gateway-lab ก่อน แล้วรันประตู
node gateway.jsประตูเปิดที่ http://localhost:3000อ่านโค้ดประตูทีละส่วน
| ส่วน | ทำอะไร |
|---|---|
| KEY | คีย์เดียวที่ยอมให้ผ่าน ในของจริงต้องเก็บเป็นความลับ ไม่เขียนลงโค้ด |
| LIMIT + WINDOW_MS | ได้ 5 ครั้งต่อ 10 วินาที ต่อหนึ่งคีย์ |
| ROUTES | ตารางชี้ทาง path ไหนไปพอร์ตไหน |
| hits | จดเวลาของคำขอแต่ละคีย์ แล้วทิ้งอันที่เก่ากว่า 10 วินาที |
| req.headers['x-api-key'] | ด่าน 1 อ่านบัตรจาก header ผิดหรือไม่มีตอบ 401 |
| hits[key].length >= LIMIT | ด่าน 2 ครบลิมิตแล้วตอบ 429 |
| ROUTES[req.url] | ด่าน 3 หาห้องไม่เจอตอบ 404 |
| http.get(...) | ส่งต่อไปห้อง รับ JSON แล้วยื่นคืน ถ้าห้องไม่ตอบ ตอบ 502 |
| console.log | พิมพ์ log ทุกคำขอ เห็นว่าใครโดนตีกลับที่ด่านไหน |
ประตูนี้ไว้เรียนเท่านั้น ตัวนับเก็บในหน่วยความจำ ปิดโปรแกรมแล้วก็หาย และไม่มี HTTPS ห้ามเอาไปใช้กับระบบจริง ระบบจริงใช้ Gateway สำเร็จรูปในหัวข้อของจริงที่ใช้กัน ลองคิดดูว่าถ้าลบด่าน 1 ทิ้ง ใครก็เดินเข้าห้องจ่ายเงินได้ นี่คือเหตุผลที่ต้องเช็กบัตรที่ประตู
ลองยิงคำขอผ่านสามด่าน
เปิดหน้าต่างที่ 3 ไว้ยิงคำขอ คำสั่งด้านล่างเขียนสำหรับ Windows PowerShell ถ้าใช้ macOS ให้พิมพ์ curl แทน curl.exe
1) ไม่มีบัตร
curl.exe -i http://localhost:3000/menuHTTP/1.1 401 Unauthorized
...
{"error":"ไม่มีคีย์ หรือคีย์ผิด"}2) มีบัตร ขอเมนู
curl.exe -H "x-api-key: devkub-123" http://localhost:3000/menu{"room":"menu","items":[{"name":"ข้าวมันไก่","price":50}]}3) ชี้ทางไปห้องจ่ายเงิน
curl.exe -H "x-api-key: devkub-123" http://localhost:3000/pay{"room":"pay","status":"ready"}4) ห้องที่ไม่มี
curl.exe -H "x-api-key: devkub-123" http://localhost:3000/abc{"error":"ไม่มีห้องนี้"}5) ยิงรัว 6 ครั้ง ดูด่านจำกัดจำนวนทำงาน
for ($i=1; $i -le 6; $i++) { curl.exe -s -o NUL -w "%{http_code} " -H "x-api-key: devkub-123" http://localhost:3000/orders }for i in 1 2 3 4 5 6; do curl -s -o /dev/null -w "%{http_code} " -H "x-api-key: devkub-123" http://localhost:3000/orders; done200 200 429 429 429 429ทำไมผ่านแค่ 2 ครั้ง เพราะข้อ 2–4 ใช้โควตาไปแล้ว 3 ครั้ง (ข้อ 4 ที่ได้ 404 ก็นับ เพราะผ่านด่าน 2 มาก่อนถึงด่าน 3) รวมเป็น 5 ครั้งใน 10 วินาทีพอดี ส่วนข้อ 1 ที่ได้ 401 ไม่ถูกนับ เพราะโดนตีกลับตั้งแต่ด่านแรก ถ้าทำช้ากว่า 10 วินาที ตัวเลขอาจต่างไปเล็กน้อย รอ 10 วินาทีแล้วยิงใหม่จะได้ 200 อีกครั้ง
กลับไปดูหน้าต่างที่ 2 จะเห็น log ของทุกคำขอ
GET /menu -> 401
GET /menu -> 200
GET /pay -> 200
GET /abc -> 404
GET /orders -> 200
GET /orders -> 200
GET /orders -> 429
...แบบฝึกและแก้ปัญหา
แก้ไฟล์แล้วต้องหยุดโปรแกรมด้วย Ctrl + C แล้วรันใหม่ทุกครั้ง
| ข้อ | ลองทำ | ควรได้ |
|---|---|---|
| 1 | เปลี่ยน LIMIT เป็น 2 แล้วรันประตูใหม่ ยิงรัว 4 ครั้ง | 200 200 429 429 |
| 2 | เพิ่มห้องที่ 4: ใน services.js เพิ่ม room(4004, {room: 'notify'}); และใน ROUTES เพิ่ม '/notify': 4004, | ยิง /notify ได้ {"room":"notify"} |
| 3 | ส่งคีย์ผิด เช่น x-api-key: abc | 401 |
| 4 | กด Ctrl + C ปิดหน้าต่างที่ 1 แล้วยิง /menu ด้วยคีย์ถูก | 502 ห้องหลังบ้านไม่ตอบ |
| 5 | ย้ายห้องเมนูไปพอร์ต 4010 แก้แค่ services.js กับ ROUTES | คำสั่ง curl เดิมยังใช้ได้ |
ข้อ 5 คือข้อดีของประตูที่เห็นชัดที่สุด ห้องย้ายที่ได้โดยแอปไม่ต้องรู้เรื่องเลย
ถ้าเจอปัญหา ดูตารางนี้
| อาการ | น่าจะเป็นเพราะ | ทำยังไง |
|---|---|---|
| node ไม่รู้จักคำสั่ง | ยังไม่ติดตั้ง หรือยังไม่เปิดหน้าต่างใหม่ | ติดตั้งรุ่น LTS แล้วปิดเปิดหน้าต่างคำสั่ง |
| EADDRINUSE: address already in use | พอร์ตถูกใช้อยู่ หรือรันซ้ำ | ปิดหน้าต่างเก่า หรือเปลี่ยนเลขพอร์ต (ถ้าเปลี่ยน 3000 ต้องเปลี่ยนในคำสั่ง curl ด้วย) |
| Failed to connect | ประตูยังไม่เปิด | รัน node gateway.js ในหน้าต่างที่ 2 |
| ได้ 401 ทั้งที่ใส่คีย์ | ชื่อ header หรือคีย์พิมพ์ผิด | ต้องเป็น x-api-key: devkub-123 ตรงทุกตัว |
| ได้ 502 | หน้าต่างห้องหลังบ้านปิดอยู่ | รัน node services.js ใหม่ |
| PowerShell ฟ้อง error กับ -H | พิมพ์ curl แทน curl.exe | ใช้ curl.exe |
| ภาษาไทยเพี้ยน | บันทึกไฟล์ไม่ใช่ UTF-8 | บันทึกใหม่เป็น UTF-8 |
| ได้ 429 ตลอด | ยังไม่ครบ 10 วินาที | รอแล้วลองใหม่ |
เลิกแล้วกด Ctrl + C ในหน้าต่างที่ 1 และ 2 แล้วลบโฟลเดอร์ gateway-lab ได้เลย ไม่มีอะไรค้างในเครื่อง
ของจริงที่ใช้กัน
ระบบจริงไม่เขียนประตูเอง แต่ใช้ Gateway สำเร็จรูปที่ทำสามด่านนี้ได้ดีกว่ามาก พร้อม HTTPS, log และฟีเจอร์อื่นๆ สองตัวที่ใช้กันแพร่หลายคือ
| เรื่อง | Amazon API Gateway | Kong Gateway |
|---|---|---|
| แบบ | บริการบนคลาวด์ของ AWS | มีรุ่นโอเพนซอร์สที่ติดตั้งเองได้ |
| ดูแลเครื่อง | AWS ดูแลให้ | เราดูแลเอง |
| ค่าใช้จ่าย | จ่ายตามจำนวนคำขอที่รับและข้อมูลที่ส่งออก ไม่มีค่าขั้นต่ำ | รุ่นโอเพนซอร์สไม่เสียค่าโปรแกรม แต่ค่าเครื่องเราจ่ายเอง |
ข้อมูลในตารางมาจากหน้าเว็บทางการ ณ ต.ค. 2026 เรายังไม่ได้ติดตั้ง Kong หรือเปิด Amazon API Gateway ลองเอง ราคาและฟีเจอร์ให้เชื่อหน้าเว็บ ณ วันที่คุณอ่าน
สรุป
- API คือการส่งคำขอ (method + path + header) แล้วได้คำตอบ (รหัสสถานะ + JSON)
- API Gateway คือประตูบานเดียวหน้าบริการทั้งหมด แอปรู้แค่ที่อยู่เดียว
- ด่าน 1 เช็กบัตร ไม่ผ่านได้ 401 ด่าน 2 จำกัดจำนวน เกินได้ 429 ด่าน 3 ชี้ทาง ไม่มีห้องได้ 404
- ประตูส่งต่อแล้วห้องไม่ตอบได้ 502
- โปรเจกต์เล็กเซิร์ฟเวอร์เดียวยังไม่จำเป็นต้องมี Gateway มันคุ้มเมื่อมีหลายบริการหรือเปิด API ให้คนนอก
| เรื่อง | จำแค่นี้ |
|---|---|
| API | ส่งคำขอ ได้คำตอบกลับ |
| Gateway | ประตูเดียวหน้าบริการทั้งหมด |
| ด่าน 1 | เช็กบัตร ไม่ผ่าน 401 |
| ด่าน 2 | จำกัดจำนวน เกิน 429 |
| ด่าน 3 | ชี้ทางตาม path ไม่มีห้อง 404 |
อ่านต่อจากหน้าทางการ
พร้อมแล้วก็ไปทำ Quiz ท้ายบทด้านล่างเพื่อรับ XP ได้เลยครับ