メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

Middleware คืออะไร? ทำไมต้องใช้?

บทความนี้แนะนำ Middleware ซึ่งเป็นซอฟต์แวร์ที่ทำหน้าที่เป็น "คนกลาง" ระหว่าง Request และ Response ของ API เพื่อตรวจสอบ, ปรับปรุง, หรือจัดการ Request/Response ก่...

Middleware คืออะไร? ทำไมต้องใช้?

สวัสดีครับ! ในบทเรียนที่แล้ว เราได้เรียนรู้วิธีการสร้างระบบ Authentication ด้วย API Key เพื่อรักษาความปลอดภัยให้กับ API ของเรา ในบทนี้ เราจะมาทำความรู้จักกับเครื่องมือที่ทรงพลังอีกอย่างหนึ่งที่เรียกว่า Middleware ซึ่งจะช่วยให้การจัดการ Request และ Response ของ API ของเราเป็นระเบียบและมีประสิทธิภาพมากยิ่งขึ้น

Middleware คืออะไร?

Middleware คือซอฟต์แวร์ที่ทำงานอยู่ระหว่าง Request ที่เข้ามายัง API ของเรา และ Response ที่ API ส่งกลับไปยัง Client พูดง่ายๆ ก็คือ มันเป็นเหมือน "คนกลาง" ที่คอยตรวจสอบและปรับปรุง Request และ Response ก่อนที่จะส่งต่อไปยังปลายทาง

ลองนึกภาพว่าคุณกำลังสั่งอาหารจากร้านอาหารแห่งหนึ่ง พนักงานเสิร์ฟ (Middleware) จะเป็นคนที่รับออเดอร์ของคุณ (Request) จากนั้นส่งไปยังเชฟ (API Endpoint) เชฟจะทำอาหารตามที่คุณสั่ง (Process Request) และส่งอาหารกลับมาให้พนักงานเสิร์ฟ พนักงานเสิร์ฟอาจจะตรวจสอบว่าอาหารถูกต้องตามที่สั่งหรือไม่ (Validate Response) ก่อนที่จะนำไปเสิร์ฟให้คุณ (Send Response)

ประโยชน์ของ Middleware

Middleware มีประโยชน์มากมายในการพัฒนา API ดังนี้:

  • Authentication และ Authorization: ตรวจสอบว่าผู้ใช้มีสิทธิ์เข้าถึง API หรือไม่
  • Logging: บันทึกข้อมูลเกี่ยวกับการเข้าถึง API (เช่น เวลา, IP Address, Endpoint ที่เข้าถึง) เพื่อตรวจสอบและแก้ไขปัญหา
  • Input Validation: ตรวจสอบความถูกต้องของข้อมูลที่ส่งเข้ามาใน Request
  • Request Transformation: ปรับเปลี่ยน Request ก่อนที่จะส่งไปยัง API Endpoint (เช่น แปลงข้อมูล, เพิ่ม Header)
  • Response Transformation: ปรับเปลี่ยน Response ก่อนที่จะส่งกลับไปยัง Client (เช่น เพิ่ม Header, แปลงรูปแบบข้อมูล)
  • Caching: จัดเก็บ Response ที่ได้จาก API Endpoint เพื่อลดภาระการทำงานของ Server
  • Error Handling: จัดการกับ Error ที่เกิดขึ้นใน API
  • Rate Limiting: จำกัดจำนวน Request ที่ผู้ใช้สามารถส่งได้ในระยะเวลาที่กำหนด

การใช้ Middleware ช่วยให้เราสามารถแยกส่วนการทำงานต่างๆ ออกจาก Core Logic ของ API ได้ ทำให้ Code ของเราสะอาด อ่านง่าย และบำรุงรักษาได้ง่ายขึ้น นอกจากนี้ยังช่วยลดความซ้ำซ้อนของ Code เนื่องจากเราสามารถนำ Middleware ไปใช้กับหลายๆ Endpoint ได้

ตัวอย่างการใช้งาน Middleware

เพื่อให้เห็นภาพการใช้งาน Middleware มากขึ้น เราจะยกตัวอย่างการใช้งาน Middleware สำหรับ Authentication ใน PHP

สมมติว่าเรามี API Endpoint สำหรับดึงข้อมูล User โดย Endpoint นี้ต้องการ API Key เพื่อยืนยันตัวตนของผู้ใช้

ไฟล์: `api.php` (API Endpoint)

<?php

// จำลองการเชื่อมต่อฐานข้อมูล
function getUserByApiKey($apiKey) {
    // สมมติว่ามีการตรวจสอบ API Key ในฐานข้อมูล
    if ($apiKey === "YOUR_API_KEY") {
        return ["id" => 1, "username" => "testuser"];
    } else {
        return null;
    }
}

// ดึง API Key จาก Header
$apiKey = $_SERVER['HTTP_API_KEY'] ?? null;

// ตรวจสอบ API Key
$user = getUserByApiKey($apiKey);

if ($user) {
    // ส่งข้อมูล User กลับไป
    header('Content-Type: application/json');
    echo json_encode($user);
} else {
    // ส่ง Error กลับไป
    http_response_code(401); // Unauthorized
    header('Content-Type: application/json');
    echo json_encode(["error" => "Invalid API Key"]);
}

?>

ใน Code นี้ เราทำการตรวจสอบ API Key โดยตรงใน API Endpoint ซึ่งทำให้ Code ดูรกและยากต่อการบำรุงรักษา เราสามารถย้ายส่วนการตรวจสอบ API Key ไปไว้ใน Middleware ได้ดังนี้:

ไฟล์: `auth_middleware.php` (Middleware)

<?php

class AuthMiddleware {
    public function handle() {
        // จำลองการเชื่อมต่อฐานข้อมูล
        function getUserByApiKey($apiKey) {
            // สมมติว่ามีการตรวจสอบ API Key ในฐานข้อมูล
            if ($apiKey === "YOUR_API_KEY") {
                return ["id" => 1, "username" => "testuser"];
            } else {
                return null;
            }
        }

        // ดึง API Key จาก Header
        $apiKey = $_SERVER['HTTP_API_KEY'] ?? null;

        // ตรวจสอบ API Key
        $user = getUserByApiKey($apiKey);

        if (!$user) {
            // ส่ง Error กลับไป และหยุดการทำงานของ Script
            http_response_code(401); // Unauthorized
            header('Content-Type: application/json');
            echo json_encode(["error" => "Invalid API Key"]);
            exit; // สำคัญ: ต้องหยุดการทำงานของ Script
        }

        // ถ้า API Key ถูกต้อง ให้ส่ง User ไปยัง Request
        $_REQUEST['user'] = $user; //เก็บข้อมูล User ไว้ใน $_REQUEST เพื่อนำไปใช้ใน Endpoint
    }
}

?>

ไฟล์: `api.php` (API Endpoint ที่ใช้ Middleware)

<?php

require_once 'auth_middleware.php';

$authMiddleware = new AuthMiddleware();
$authMiddleware->handle();

// ดึงข้อมูล User จาก Request (ที่ Middleware ใส่ไว้)
$user = $_REQUEST['user'];

// ส่งข้อมูล User กลับไป
header('Content-Type: application/json');
echo json_encode($user);

?>

ใน Code นี้ เราได้สร้าง Class `AuthMiddleware` ที่มี Method `handle()` ซึ่งทำหน้าที่ตรวจสอบ API Key และส่ง Error กลับไปหาก API Key ไม่ถูกต้อง ถ้า API Key ถูกต้อง ระบบจะเก็บข้อมูล User ไว้ใน `$_REQUEST['user']` เพื่อให้ API Endpoint สามารถเข้าถึงได้

ใน `api.php` เราทำการ `require_once` ไฟล์ `auth_middleware.php` และสร้าง Instance ของ `AuthMiddleware` จากนั้นเรียก Method `handle()` ก่อนที่จะดำเนินการใดๆ กับ API Endpoint

ข้อควรระวัง:

  • ลำดับการทำงานของ Middleware: ลำดับที่เรียกใช้ Middleware มีความสำคัญมาก Middleware ที่ถูกเรียกใช้ก่อน จะมีผลต่อ Request และ Response ก่อน Middleware ที่ถูกเรียกใช้ทีหลัง
  • การหยุดการทำงานของ Script: ใน Middleware ที่ใช้สำหรับ Authentication หาก API Key ไม่ถูกต้อง เราต้องหยุดการทำงานของ Script ด้วยคำสั่ง `exit;` เพื่อป้องกันไม่ให้ API Endpoint ทำงาน
  • การส่งข้อมูลไปยัง Endpoint: Middleware สามารถส่งข้อมูลไปยัง Endpoint ได้โดยการเพิ่มข้อมูลลงใน `$_REQUEST` หรือ `$_SERVER`

กรณีใช้งานจริงและข้อผิดพลาดที่พบบ่อย

  • Logging Middleware: บันทึกข้อมูลการเข้าถึง API ทุกครั้ง เพื่อใช้ในการตรวจสอบและแก้ไขปัญหา
    • ข้อผิดพลาดที่พบบ่อย: ลืมบันทึกข้อมูลที่สำคัญ เช่น IP Address, User Agent
  • Input Validation Middleware: ตรวจสอบความถูกต้องของข้อมูลที่ส่งเข้ามาใน Request ก่อนที่จะส่งไปยัง API Endpoint
    • ข้อผิดพลาดที่พบบ่อย: ไม่ได้ตรวจสอบ Input ทุก Field, ใช้ Regular Expression ที่ไม่ถูกต้อง
  • CORS Middleware: ตั้งค่า CORS Headers เพื่ออนุญาตให้ Client จาก Domain อื่นๆ สามารถเข้าถึง API ได้
    • ข้อผิดพลาดที่พบบ่อย: ตั้งค่า `Access-Control-Allow-Origin` เป็น `*` ซึ่งไม่ปลอดภัย

หวังว่าบทเรียนนี้จะช่วยให้คุณเข้าใจแนวคิดและประโยชน์ของ Middleware มากยิ่งขึ้น ในบทเรียนต่อไป เราจะมาลงมือสร้าง Middleware ใน PHP กันอย่างละเอียดครับ!

Office.in.th Custom Service

この構成をもとにシステムを開発・カスタマイズしたいですか?

Office.in.th は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る