PlusMagi's Blog By Pitt Phunsanit Backend ย้ายจาก $.post() สู่ Fetch API: การส่ง HTTP POST Request พร้อม JSON Body ด้วย Pure JavaScript

ย้ายจาก $.post() สู่ Fetch API: การส่ง HTTP POST Request พร้อม JSON Body ด้วย Pure JavaScript

ในโลกของการพัฒนาเว็บแอปพลิเคชันสมัยใหม่ การสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ (Client-Server Communication) ถือเป็นหัวใจสำคัญที่ทำให้ระบบต่างๆ สามารถทำงานร่วมกันได้อย่างราบรื่น ในอดีต นักพัฒนามักคุ้นเคยกับการใช้ไลบรารีอย่าง jQuery เพื่อจัดการกับคำขอแบบ Asynchronous JavaScript and XML (AJAX) ซึ่งทำได้ง่ายและสะดวก

อย่างไรก็ตาม เมื่อมาตรฐานเว็บก้าวหน้าขึ้น การพึ่งพาไลบรารีภายนอกสำหรับการทำงานพื้นฐานจึงเป็นสิ่งที่ควรหลีกเลี่ยง Fetch API จึงถูกพัฒนาขึ้นมาเพื่อเป็น Web API มาตรฐานที่ทันสมัยกว่า XMLHttpRequest (XHR) และมอบประสบการณ์การเขียนโค้ดแบบ Asynchronous ที่สะอาดและมีประสิทธิภาพสูงกว่ามาก

Fetch API คืออะไร? ทำไมต้องใช้แทน $.post()?

Fetch API ถูกออกแบบมาเพื่อจัดการ Network Requests ด้วย Promise ซึ่งเป็นกลไกที่ช่วยให้การเขียนโค้ดแบบ Asynchronous (เช่น การรอรับข้อมูลจากเซิร์ฟเวอร์) มีความอ่านง่ายและสามารถจัดการ Flow ของข้อมูลได้อย่างเป็นระบบกว่าการใช้ Callback Hell หรือแม้แต่ XHR แบบเดิมๆ

เมื่อเราต้องการส่งข้อมูลประเภท JSON ผ่าน HTTP POST Request สิ่งที่เราต้องทำคือการแปลง Object JavaScript ให้เป็น String JSON ก่อน จากนั้นจึงกำหนด Header ที่สำคัญที่สุดคือ Content-Type: application/json เพื่อแจ้งให้เซิร์ฟเวอร์ปลายทางทราบว่า Body ของคำขอที่กำลังจะส่งไปนั้นอยู่ในรูปแบบ JSON ซึ่งช่วยให้ Backend สามารถตีความข้อมูลได้อย่างถูกต้องแม่นยำ

โครงสร้างการส่ง POST Request ด้วย Pure JavaScript

หัวใจสำคัญของการใช้ Fetch API คือการกำหนด Object ที่สองในฟังก์ชัน fetch() ซึ่งประกอบด้วย method, headers และ body

  • Method: ต้องระบุเป็น 'POST'
  • Headers: ต้องมี {'Content-Type': 'application/json'} เสมอ
  • Body: ข้อมูล JavaScript Object จะต้องถูกแปลงเป็น JSON String โดยใช้ JSON.stringify(object) ก่อนส่งเสมอ

การจัดการ Promise ใน Fetch API ทำให้เราสามารถใช้ .then() และ .catch() เพื่อจัดการผลลัพธ์ (Response) และข้อผิดพลาดได้อย่างมีโครงสร้าง:

JavaScript

const postData = {\n    username: "developer_js",\n    email: "[email protected]"\n};\n\nfetch('https://api.example.com/submit', {\n    method: 'POST', // 1. ระบุ method เป็น POST\n    headers: {\n        'Content-Type': 'application/json' // 2. สำคัญมาก: บอกเซิร์ฟเวอร์ว่าเราส่ง JSON\n    },\n    body: JSON.stringify(postData) // 3. แปลง Object JS ให้เป็น JSON String\n})\n.then(response => {\n    if (!response.ok) {\n        throw new Error(`HTTP error! status: ${response.status}`);\n    }\n    return response.json(); // อ่าน Response Body เป็น JSON อีกครั้ง\n})\n.then(data => {\n    console.log('Success:', data);\n})\n.catch(error => {\n    console.error('Error sending request:', error);\n});

การประยุกต์ใช้ในระดับสถาปัตยกรรม (Architectural Use Cases)

การเปลี่ยนผ่านนี้ไม่ได้เป็นเพียงแค่การอัปเกรดโค้ด แต่เป็นการยกระดับความเข้าใจในการจัดการข้อมูลแบบมาตรฐาน การทำความเข้าใจวงจรชีวิตของการส่งข้อมูลด้วย Promise และ JSON Serialization เป็นทักษะที่จำเป็นสำหรับ Senior Developer ในการสร้างแอปพลิเคชันระดับ Enterprise

แนวคิดเชิงสถาปัตยกรรม: การจัดการ Payload ข้อมูล (Conceptual Data Flow)

ในมุมมองของระบบหลังบ้าน (Backend/Database), เมื่อเราได้รับ JSON Body เข้ามาผ่าน API Endpoint เราจะต้องทำการ Parse และตรวจสอบความถูกต้องของข้อมูลเหล่านั้นก่อนนำไปใช้งานจริง ซึ่งกระบวนการนี้คล้ายกับการรับและประมวลผลโครงสร้างข้อมูลที่ซับซ้อน เช่น การจัดการ Payload ที่มี Array หรือ Object ซ้อนกัน

ตัวอย่างแนวคิดในการจำลองการรับและแยกวิเคราะห์ JSON Data ใน PostgreSQL (สมมติว่าเราได้รับ JSON payload มาแล้ว):

SQL

-- สมมติว่า 'api_payload' คือข้อมูล JSON ที่ถูกส่งมา\nWITH incoming_data AS (\n    SELECT jsonb('{"user": "john_doe", "roles": ["admin", "editor"]}') AS payload\n)\nSELECT\n    (payload ->> 'user') AS username,\n    unnest(jsonb_array_elements(payload -> 'roles')) AS role_name\nFROM incoming_data\nWHERE jsonb_typeof(payload) = 'object';

โค้ดข้างต้นแสดงให้เห็นถึงการแยกวิเคราะห์ (Unnesting) ข้อมูลจาก JSONB Payload ที่ได้รับมา ซึ่งเป็นหลักการเดียวกับการที่ Backend ต้องรับข้อมูล JSON จาก Fetch API แล้วนำไปจัดเก็บหรือประมวลผลในฐานข้อมูลอย่างมีโครงสร้าง

สรุป: ก้าวสู่มาตรฐานเว็บยุคใหม่

การเปลี่ยนจากการใช้ไลบรารีภายนอกมาสู่ Pure JavaScript API อย่าง Fetch ไม่ได้เป็นเพียงแค่ทางเลือก แต่คือการยึดตามมาตรฐานของเว็บที่ทันสมัยที่สุด การทำความเข้าใจ Promise, Headers และ JSON Serialization จะช่วยให้เราสร้างแอปพลิเคชันที่มีประสิทธิภาพสูง ปลอดภัย และสามารถบำรุงรักษาได้ง่ายตามหลักการของ Senior Developer อย่างแท้จริง