`fetch()` ส่ง request แต่ยังไม่ใช่ข้อมูลจริง
สิ่งแรกที่ได้กลับมาคือ `Response` object ไม่ใช่ object ปลายทางที่พร้อมใช้ทันที
Fetch
มองภาพรวมของ fetch() ตั้งแต่การส่ง request, เช็ก response.ok, การอ่าน body แบบต่าง ๆ ไปจนถึงการเลือกใช้ GET, POST, PUT, PATCH และ DELETE พร้อม playground ให้ลองเองก่อนเข้าบทเรียนย่อย
`fetch()` คือ built-in browser API สำหรับส่ง HTTP request ไปคุยกับ server แล้วรับ response กลับมา โดยไม่ต้องติดตั้ง library เพิ่ม จุดสำคัญคือ `fetch()` ไม่คืนข้อมูลจริงทันที แต่คืน **Promise<Response>** มาก่อน เพราะการคุยกับ server ต้องรอ network, การประมวลผลของปลายทาง และการส่งข้อมูลกลับมา
รอ 2 จังหวะ: รอ response object ก่อน แล้วค่อยรอการอ่าน body อีกครั้ง
async function fetchTodo() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/todos/1"
);
const todo = await response.json();
console.log(response instanceof Response); // true
console.log("status:", response.status); // 200
console.log("title:", todo.title); // delectus aut autem
}
fetchTodo();| ขั้น | เราได้อะไรกลับมา | หน้าที่ของเรา |
|---|---|---|
| 1. ส่ง request | `Promise<Response>` | ใช้ `await fetch(url, options)` เพื่อรอ response object |
| 2. ตรวจ response | `response.ok`, `response.status`, `response.headers` | เช็กว่า request สำเร็จจริงหรือไม่ก่อนอ่านข้อมูล |
| 3. อ่าน body | ข้อมูลจริงในรูป JSON, text หรือ binary | เลือก `.json()`, `.text()` หรือ method อื่นให้ตรงชนิดข้อมูล |
เวลาใช้ fetch มือใหม่มักคิดว่า `await fetch(...)` แล้วจะได้ object ปลายทางทันที แต่จริง ๆ เราเพิ่งได้ **ซอง response** มาก่อน จากนั้นยังต้องดู status และค่อยอ่าน body ออกมาอีกที
นี่คือ pattern เดียวที่จะถูกขยายต่อในบท GET, write methods และ DELETE
async function loadProfile() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/users/1"
);
if (!response.ok) {
throw new Error("โหลดข้อมูลไม่สำเร็จ");
}
const profile = await response.json();
console.log(profile.name);
console.log(profile.email);
}
loadProfile();| Method | ใช้เมื่อไร | มี body ไหม | ของที่ต้องระบุเพิ่ม | ตัวอย่างผลลัพธ์ |
|---|---|---|---|---|
| GET | อ่านข้อมูล | ไม่มี | URL + ส่วนใหญ่ก็พอ | JSON หรือ text จาก server |
| POST | สร้างข้อมูลใหม่ | มี (JSON) | `method`, `headers`, `body` | representation ของ resource ใหม่ |
| PUT | แทนที่ทั้งก้อน | มี (JSON) | `method`, `headers`, `body` | representation ใหม่ทั้ง record |
| PATCH | แก้ไขบาง field | มี (JSON) | `method`, `headers`, `body` | representation ที่อัปเดตแล้ว |
| DELETE | ลบข้อมูล | มักไม่มี | `method` + URL เป้าหมาย | มักได้ `204 No Content` หรือ status สำเร็จ |
ภาพรวมคือทุก method ใช้ flow เดียวกัน: ส่ง request → เช็ก response.ok → อ่าน body ต่างกันแค่ intent และรายละเอียดที่ต้องระบุเพิ่มใน options object
| สิ่งที่ดู | ใช้เมื่อไร | หมายเหตุ |
|---|---|---|
| `response.ok` | อยากเช็กว่า status อยู่ช่วง 200-299 หรือไม่ | ใช้คู่กับ `if (!response.ok)` บ่อยที่สุด |
| `response.status` | อยากรู้เลข status เช่น 200, 404, 500 | ช่วยทำ error message ให้เฉพาะเจาะจงขึ้น |
| `response.json()` | body เป็น JSON และอยากได้ object กลับมา | คืน Promise จึงต้อง `await` |
| `response.text()` | body เป็นข้อความธรรมดา หรืออยากดู raw body | เหมาะกับ endpoint ที่ไม่ได้ตอบ JSON |
| ถ้าโจทย์ของคุณเป็นแบบนี้ | ควรไปบทไหน |
|---|---|
| ยังไม่แม่นเรื่อง request, response, status code และ JSON | `HTTP Request / Response Basics` |
| อยากดึงข้อมูลจาก API ด้วย method เริ่มต้นของ fetch | `Fetch GET Requests` |
| อยากส่งข้อมูลไปสร้างหรือแก้ไข resource | `Fetch POST / PUT / PATCH` |
| อยากลบข้อมูลและเข้าใจ response ของ DELETE | `Fetch DELETE` |
จำ 4 ข้อนี้ไว้ก่อน แล้วการอ่านบทลูกจะง่ายขึ้นมาก
สิ่งแรกที่ได้กลับมาคือ `Response` object ไม่ใช่ object ปลายทางที่พร้อมใช้ทันที
HTTP error หลายแบบยังคืน response กลับมาอยู่ จึงต้องเช็กเองก่อน `response.json()`
JSON ใช้ `.json()`, ข้อความใช้ `.text()`, และข้อมูลแบบอื่นต้องเลือก method ให้ตรง
GET ใช้อ่านข้อมูล ส่วน POST, PUT, PATCH และ DELETE ใช้เปลี่ยน state ของฝั่ง server