ข้ามไปยังเนื้อหา

การสร้าง API ด้วย Echo

ถ้าคุณมาจาก Node.js คุณคงคุ้นเคยกับแนวคิดของ HTTP framework แบบเบาอยู่แล้ว: ฟังก์ชันที่แมป path + verb ไปยัง handler, middleware pipeline และวิธี serialize JSON ฝั่ง Go ก็มี Echo เป็น framework แบบนั้น

สิ่งที่ต้องการNode.js / ExpressGo / Echo
หน่วยหลัก(req, res, next) functionsfunc(c *echo.Context) error
Routingapp.get('/path', handler)e.GET("/path", handler)
Middlewareapp.use(fn)e.Use(fn)
ตอบกลับ JSONres.json({ … })c.JSON(200, payload)
ส่งต่อ errornext(err)return err

Echo แข่งขันกับ Fastify และ NestJS ในแง่แนวคิด แต่เป็น binary ที่ compile แล้วเพียงตัวเดียว ไม่มี runtime, ไม่มี VM และไม่มี node_modules เวลา cold-start คือไมโครวินาที ไม่ใช่วินาที

Go มีหลาย web framework (Gin, Chi, Fiber, stdlib net/http) Echo อยู่ในจุดที่พอดี:

  • พื้นที่ผิวขนาดเล็ก — อ่าน source code ทั้งหมดได้ในสุดสัปดาห์เดียว
  • Idiomatic — handler คืนค่า error ตรงกับ pattern errors-as-values ของ Go
  • มี built-in ครบ — Logger, Recover, CORS, GZIP, BasicAuth มาพร้อมกัน
  • เสถียร — Echo v5 (2026) คือ major version ปัจจุบัน ส่วน v4 ยังได้รับ security fix จนถึงสิ้นปี 2026

tutorial ส่วนใหญ่บนเว็บยังเป็น v4 อยู่ บทนี้ใช้ v5 (github.com/labstack/echo/v5, ต้องใช้ Go 1.25 ขึ้นไป) ความต่างที่คุณจะเจอ:

v4v5
func(c echo.Context) error — Context เป็น interfacefunc(c *echo.Context) error — Context เป็น struct
middleware.Logger(), e.Logger เป็น interface ของ Echo เองmiddleware.RequestLogger(), e.Logger เป็น *slog.Logger
e.Logger.Fatal(e.Start(":1323"))if err := e.Start(":1323"); err != nil { … } (หรือ echo.StartConfig สำหรับ graceful shutdown)
e.HTTPErrorHandler = func(err error, c echo.Context)e.HTTPErrorHandler = func(c *echo.Context, err error)
err.(*echo.HTTPError) กับ echo.ErrNotFoundecho.StatusCode(err) — error สำเร็จรูปไม่ใช่ *HTTPError อีกแล้ว
c.ParamNames() / c.ParamValues()c.PathValues() และ helper แบบมี type echo.PathParam[int](c, "id")

sed สองบรรทัดจัดการงาน migration ได้เกือบหมด: แทน echo/v4 ด้วย echo/v5 และแทน echo.Context ด้วย *echo.Context

TypeScript
// Express (Node.js)
import express from 'express';
const app = express();
app.use(express.json());
app.get('/ping', (req, res) => {
res.json({ message: 'pong' });
});
app.listen(1323, () => console.log('listening'));
Go
// Echo (Go)
package main
import (
"log/slog"
"net/http"
"os"
"github.com/labstack/echo/v5"
)
func main() {
e := echo.New()
e.GET("/ping", func(c *echo.Context) error {
return c.JSON(http.StatusOK, map[string]string{
"message": "pong",
})
})
if err := e.Start(":1323"); err != nil {
slog.Error("server stopped", "err", err)
os.Exit(1)
}
}

ตลอดบทนี้เราจะสร้าง Books REST API — สร้าง อ่าน อัปเดต และลบหนังสือ — ทีละขั้นตอน:

  1. สร้างโปรเจกต์ด้วย go.mod และ main.go
  2. กำหนด route และฟังก์ชัน handler
  3. เพิ่ม middleware (logging, recovery, CORS)
  4. Bind request body และ validate ด้วย struct tag
  5. จัดรูปแบบ JSON response พร้อม status code
  6. จัดการ error แบบรวมศูนย์ — วิธีแบบ Go
  7. เชื่อมต่อฐานข้อมูลผ่าน database/sql
  8. เขียน handler test ด้วย httptest

แต่ละบทสามารถอ่านได้แยกกัน แต่โปรเจกต์จะเติบโตขึ้นเรื่อย ๆ

ฟังก์ชันใดที่ใช้สร้าง Echo instance ใหม่?
ฟังก์ชัน handler ของ Echo คืนค่าชนิดใด?
method ไหนที่ใช้เริ่ม Echo server บน address ที่กำหนด?