เลือก method ให้ตรง intent
POST สำหรับสร้าง, PUT สำหรับแทนที่ทั้งก้อน, PATCH สำหรับแก้บางส่วน
Fetch
เรียนรู้การส่งข้อมูลด้วย fetch() ผ่าน POST, PUT และ PATCH พร้อม headers, Content-Type, JSON.stringify() และ pattern เช็ก response หลัง create/update
เมื่อ frontend ต้องส่งข้อมูลไปให้ server เพื่อ “เปลี่ยน state” เรามักใช้ method กลุ่ม write เช่น `POST`, `PUT` และ `PATCH` ซึ่งแต่ละตัวสื่อ intent ไม่เหมือนกัน
| Method | เหมาะกับงานแบบไหน | ภาพจำ |
|---|---|---|
| POST | สร้าง resource ใหม่ | ส่งข้อมูลใหม่เข้าไปเพื่อให้ server สร้าง record |
| PUT | แทนที่ข้อมูลทั้งก้อน | ส่ง representation ใหม่ของ resource ทั้งตัว |
| PATCH | แก้เฉพาะบาง field | ส่งเฉพาะส่วนที่อยากอัปเดต |
เวลาส่งข้อมูล JSON ด้วย fetch เรามักต้องส่ง options object ที่มี 3 ส่วนหลักพร้อมกัน: `method`, `headers`, และ `body` จุดพลาดที่พบบ่อยคือส่ง object ตรง ๆ เข้า `body` หรือไม่ตั้ง `Content-Type` ทำให้ server ตีความข้อมูลผิด
const response = await fetch("/api/todos", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "เรียน Fetch API",
completed: false,
}),
});async function createTodo(title) {
const response = await fetch(
"https://jsonplaceholder.typicode.com/todos",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
userId: 1,
title: title,
completed: false,
}),
}
);
if (!response.ok) {
throw new Error("สร้าง todo ไม่สำเร็จ");
}
const newTodo = await response.json();
console.log("id:", newTodo.id);
console.log("title:", newTodo.title);
}
createTodo("เรียนรู้ Fetch API");ในหลาย API เมื่อสร้างสำเร็จ server จะตอบกลับ representation ของ resource ใหม่ หรืออย่างน้อยก็ id ที่เพิ่งสร้างขึ้นมา ทำให้ frontend เอาไปอัปเดต UI ต่อได้ทันที
async function replaceTodo(id, todo) {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${id}`,
{
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(todo),
}
);
if (!response.ok) {
throw new Error("แทนที่ todo ไม่สำเร็จ");
}
return response.json();
}
async function patchTodo(id, partialTodo) {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${id}`,
{
method: "PATCH",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(partialTodo),
}
);
if (!response.ok) {
throw new Error("แก้ไข todo ไม่สำเร็จ");
}
return response.json();
}การส่งข้อมูลสำเร็จไม่ได้วัดที่ `fetch()` resolve อย่างเดียว แต่ต้องเช็ก status ด้วยเหมือน GET เพราะ server อาจตอบ `400`, `401` หรือ `500` กลับมาได้เช่นกัน
จำ pattern นี้ไว้ให้ขึ้นใจก่อนจะใช้กับฟอร์มหรือ API จริง
POST สำหรับสร้าง, PUT สำหรับแทนที่ทั้งก้อน, PATCH สำหรับแก้บางส่วน
อย่าส่ง object ตรง ๆ เข้า `body` เพราะ browser จะไม่แปลงเป็น JSON ให้เอง
แม้ request ไปถึง server แล้ว status อาจยังเป็น 4xx หรือ 5xx ได้