JavaScript
Fetch
Fetch GET Requests
ฝึกใช้ fetch() สำหรับ GET requests ตั้งแต่การอ่าน response.ok และ response.status ไปจนถึงการ parse JSON/text และการส่ง query parameters ด้วย URLSearchParams
GET คือ method เริ่มต้นของ fetch
ถ้าเรียก `fetch(url)` โดยไม่ส่ง options ตัวที่สอง browser จะใช้ HTTP method เป็น **GET** อัตโนมัติ ซึ่งเหมาะกับการ “ขออ่านข้อมูล” จาก server โดยไม่ตั้งใจเปลี่ยน state ฝั่งปลายทาง
async function fetchTodo() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/todos/1"
);
const todo = await response.json();
console.log("title:", todo.title);
}
fetchTodo();- GET ใช้ดึงข้อมูล ไม่ได้ใช้สร้างหรือแก้ไข resource
- เพราะเป็น default method เราจึงเริ่มฝึก fetch จาก GET ได้ง่ายที่สุด
- แม้เป็นคำขออ่านข้อมูล ก็ยังต้องเช็ก response ก่อนใช้ body
อ่าน `response.ok` และ `response.status` ก่อนใช้ข้อมูล
`fetch()` จะ reject Promise ทันทีเมื่อเกิด network error บางประเภทเท่านั้น แต่ถ้า request ไปถึง server แล้ว server ตอบ `404` หรือ `500` กลับมา เรามักยังได้ `Response` object อยู่ เพราะฉะนั้น pattern ปลอดภัยคือเช็ก `response.ok` ก่อนเสมอ แล้วค่อย parse body
async function fetchTodoSafe(id) {
const response = await fetch(
`https://jsonplaceholder.typicode.com/todos/${id}`
);
if (!response.ok) {
throw new Error(
`โหลด todo #${id} ไม่สำเร็จ (status: ${response.status})`
);
}
return response.json();
}
async function main() {
try {
const todo = await fetchTodoSafe(1);
console.log(todo.title);
} catch (error) {
console.error(error.message);
}
}
main();- `response.ok` เป็น `true` เฉพาะ status 200-299
- `response.status` ช่วยให้ error message บอกปัญหาได้ชัดขึ้น
- GET ที่อ่านข้อมูลจาก API เกือบทุกตัวควรมี guard ลักษณะนี้
เลือก `.json()` หรือ `.text()` ให้ตรงชนิดข้อมูล
คำขอ GET ไม่ได้ตอบกลับเป็น JSON เสมอไป ถึงแม้ API ส่วนมากจะใช้ JSON ก็ตาม ถ้า endpoint ส่งข้อความธรรมดา HTML หรือ CSV เราควรอ่านด้วย `.text()` แทน
| method อ่าน body | ใช้เมื่อไร | ผลลัพธ์ที่ได้ |
|---|---|---|
| `response.json()` | server ส่ง JSON | JavaScript object หรือ array |
| `response.text()` | server ส่งข้อความธรรมดา, HTML, CSV หรืออยากดู raw body | string |
async function fetchTodoAsJson() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/todos/1"
);
const todo = await response.json();
console.log(typeof todo); // object
}
async function fetchTodoAsText() {
const response = await fetch(
"https://jsonplaceholder.typicode.com/todos/1"
);
const raw = await response.text();
console.log(typeof raw); // string
console.log(raw.slice(0, 30));
}ส่ง query parameters ด้วย `URLSearchParams`
เวลา GET ข้อมูล เรามักต้อง filter, search, sort หรือกำหนด limit ผ่าน query parameters เช่น `?userId=1&_limit=5` แทนที่จะต่อ string เอง ใช้ `URLSearchParams` จะปลอดภัยและอ่านง่ายกว่า เพราะมันช่วย encode ค่าให้ด้วย
async function fetchTodosByUser(userId) {
const params = new URLSearchParams({
userId: String(userId),
_limit: "5",
});
const url =
"https://jsonplaceholder.typicode.com/todos?" +
params.toString();
const response = await fetch(url);
if (!response.ok) {
throw new Error("โหลด todos ไม่สำเร็จ");
}
const todos = await response.json();
console.log("จำนวนรายการ:", todos.length);
}
fetchTodosByUser(1);- `URLSearchParams` เหมาะกับ query string ที่มีหลาย key
- ช่วย encode ค่าที่มีช่องว่างหรืออักขระพิเศษให้อัตโนมัติ
- เป็น pattern ที่ใช้บ่อยมากกับ GET endpoints จริง