ดึงข้อมูล/XMLHttpRequest ใน TypeScript

ดึงข้อมูล/XMLHttpRequest ใน TypeScript

บทความนี้อธิบายเกี่ยวกับ Fetch/XMLHttpRequest ใน TypeScript

คุณสามารถเรียนรู้เกี่ยวกับวิธีการใช้ Fetch API และ XMLHttpRequest รวมถึงความแตกต่างระหว่างทั้งสอง

YouTube Video

ดึงข้อมูล/XMLHttpRequest ใน TypeScript

ใน TypeScript การส่งคำขอ HTTP ส่วนใหญ่ดำเนินการผ่านสอง API: Fetch API และ XMLHttpRequest ด้วยการใช้ TypeScript คุณสามารถเพิ่มการตรวจสอบประเภทสำหรับคำขอและการตอบกลับในขณะสื่อสารแบบอะซิงโครนัสผ่าน API เหล่านี้ ซึ่งช่วยให้คุณเขียนโค้ดได้ปลอดภัยยิ่งขึ้น ด้านล่างนี้เราจะแนะนำวิธีการใช้งานแต่ละอย่าง

Fetch API

Fetch API เป็น API ที่ใช้ Promise สำหรับการสื่อสารแบบอะซิงโครนัส (คำขอ HTTP) ได้อย่างง่ายดาย ใน TypeScript คุณสามารถส่งคำขอโดยใช้เมธอด fetch และจัดการการตอบกลับได้อย่างปลอดภัยตามประเภท

การใช้งานพื้นฐาน

ด้านล่างนี้คือตัวอย่างเบื้องต้นในการใช้คำขอแบบ GET

 1const url = 'https://jsonplaceholder.typicode.com/posts';
 2
 3fetch(url)
 4    .then(response => {
 5        if (!response.ok) {
 6        throw new Error('Network response was not ok');
 7        }
 8        return response.json();  // Parse the response as JSON
 9    })
10    .then(data => {
11        console.log(data);
12    })
13    .catch(error => {
14        console.error('Fetch error:', error);
15    });
  • โค้ดนี้จะส่งคำขอ GET ไปยัง URL ที่ระบุไว้ แปลงผลตอบรับที่ได้รับเป็น JSON และแสดงผลลัพธ์ในคอนโซล

การจัดการข้อมูลที่ปลอดภัยตามประเภทใน TypeScript

เนื่องจากการตอบกลับจากเมธอด fetch มีประเภทที่ไม่ชัดเจน คุณสามารถใช้การตรวจสอบประเภทของ TypeScript ได้โดยการกำหนดประเภทของการตอบกลับอย่างชัดเจน

 1// Define the type for the response data
 2interface Post {
 3    userId: number;
 4    id: number;
 5    title: string;
 6    body: string;
 7}
 8
 9const url = 'https://jsonplaceholder.typicode.com/posts';
10
11fetch(url)
12    .then(response => response.json())
13    .then((data: Post[]) => {
14        data.forEach(post => {
15            console.log(`Title: ${post.title}`);
16        });
17    })
18    .catch(error => {
19        console.error('Error fetching data:', error);
20    });
  • โค้ดนี้ใช้ชนิด Post กับข้อมูลที่ดึงมาด้วย fetch ประมวลผลผลตอบสนองอย่างปลอดภัยตามประเภท และแสดงชื่อโพสต์แต่ละอันในคอนโซล

ตัวอย่างคำขอแบบ POST

เมื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ ให้ใช้เมธอด POST เพื่อส่ง JSON ในเนื้อหา ควรระบุ headers และ body

 1const postData = {
 2    title: 'foo',
 3    body: 'bar',
 4    userId: 1
 5};
 6
 7fetch('https://jsonplaceholder.typicode.com/posts', {
 8        method: 'POST',
 9        headers: {
10            'Content-Type': 'application/json'
11        },
12        body: JSON.stringify(postData)
13    })
14    .then(response => response.json())
15    .then(data => {
16        console.log('Created post:', data);
17    })
18    .catch(error => {
19        console.error('Error posting data:', error);
20    });
  • โค้ดนี้ส่งข้อมูลในรูปแบบ JSON ไปยังเซิร์ฟเวอร์ด้วยคำขอ POST รับผลตอบสนองเป็น JSON และแสดงผลลัพธ์ในคอนโซล

Fetch การใช้งานฟังก์ชันอะซิงโครนัส (async/await)

ด้วยการใช้ async/await ใน TypeScript คุณสามารถเขียนการประมวลผลแบบอะซิงโครนัสได้อย่างง่ายดายยิ่งขึ้น

 1// Define the type for the response data
 2interface Post {
 3    userId: number;
 4    id: number;
 5    title: string;
 6    body: string;
 7}
 8
 9async function fetchPosts() {
10    try {
11        const response = await fetch('https://jsonplaceholder.typicode.com/posts');
12        if (!response.ok) {
13            throw new Error('Network response was not ok');
14        }
15        const data: Post[] = await response.json();
16        console.log(data);
17    } catch (error) {
18        console.error('Fetch error:', error);
19    }
20}
21
22fetchPosts();
  • โค้ดนี้ดึงข้อมูลโพสต์แบบอะซิงโครนัสด้วยไวยากรณ์ async/await ประมวลผลผลตอบสนองในรูปแบบ Post[] และแสดงผลในคอนโซล

XMLHttpRequest

XMLHttpRequest เป็น API ที่เก่ากว่าและซับซ้อนกว่าเล็กน้อยเมื่อเทียบกับ Fetch API แต่ยังสามารถใช้ได้หากจำเป็นต้องมีการรองรับเบราว์เซอร์หรือการควบคุมที่ซับซ้อนมากขึ้น

การใช้งานพื้นฐานของ XMLHttpRequest

ด้านล่างนี้คือตัวอย่างการใช้คำขอแบบ GET

 1const xhr = new XMLHttpRequest();
 2xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts', true);
 3
 4xhr.onreadystatechange = function () {
 5    if (xhr.readyState === 4 && xhr.status === 200) {
 6        const data = JSON.parse(xhr.responseText);
 7        console.log(data);
 8    }
 9};
10
11xhr.send();
  • โค้ดนี้ส่งคำขอ GET ไปยัง URL ที่ระบุโดยใช้ XMLHttpRequest แปลงผลตอบรับเป็น JSON และแสดงผลในคอนโซล

ตัวอย่างคำขอแบบ POST

เมื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ ให้ระบุ POST ในเมธอด open และส่งข้อมูลด้วย send

 1const xhr = new XMLHttpRequest();
 2xhr.open('POST', 'https://jsonplaceholder.typicode.com/posts', true);
 3xhr.setRequestHeader('Content-Type', 'application/json');
 4
 5const postData = JSON.stringify({
 6    title: 'foo',
 7    body: 'bar',
 8    userId: 1
 9});
10
11xhr.onreadystatechange = function () {
12    if (xhr.readyState === 4 && xhr.status === 201) {
13        console.log('Created post:', xhr.responseText);
14    }
15};
16
17xhr.send(postData);
  • โค้ดนี้ส่งข้อมูลในรูปแบบ JSON ไปยังเซิร์ฟเวอร์ด้วยคำขอ POST ผ่าน XMLHttpRequest และแสดงผลตอบสนองที่มีข้อมูลที่สร้างขึ้นในคอนโซล

การจัดการข้อผิดพลาดด้วย XMLHttpRequest

คุณสามารถจัดการข้อผิดพลาดของคำขอโดยการใช้ event onerror

 1const xhr = new XMLHttpRequest();
 2xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts', true);
 3
 4xhr.onerror = function () {
 5    console.error('Request failed');
 6};
 7
 8xhr.onload = function () {
 9    if (xhr.status === 200) {
10        console.log('Response:', xhr.responseText);
11    } else {
12        console.error('Error:', xhr.status);
13    }
14};
15
16xhr.send();
  • โค้ดนี้รันคำขอ GET ผ่าน XMLHttpRequest จัดการข้อผิดพลาดของคำขอด้วย onerror และบันทึกผลตอบสนองอย่างถูกต้องทั้งในกรณีที่สำเร็จและล้มเหลว

การเปรียบเทียบ Fetch API และ XMLHttpRequest

คุณสมบัติ Fetch API XMLHttpRequest
API สมัยใหม่ ×
การสนับสนุน Promise ×
ความสามารถในการอ่าน สูง (ทำงานได้ดีร่วมกับ async/await) ต่ำ (มีการใช้ callbacks มาก)
ความเข้ากันได้ของเบราว์เซอร์ ไม่รองรับในเบราว์เซอร์เก่าบางรายการ รองรับโดยเบราว์เซอร์หลักทั้งหมด
การติดตามความคืบหน้า △ (สามารถทำได้ด้วย ReadableStream) ○ (รองรับเหตุการณ์ onprogress)
การจัดการข้อผิดพลาด ข้อผิดพลาดจะถูกจัดการในเชนของ Promise จำเป็นต้องใช้ onerror

สรุป

ใน TypeScript คุณสามารถเขียนคำขอแบบอะซิงโครนัสให้กระชับและมีความปลอดภัยในประเภทได้โดยใช้ Fetch API ในทางตรงกันข้าม XMLHttpRequest เป็น API รุ่นเก่ากว่า แต่ยังคงสามารถใช้งานได้ในบางสถานการณ์ โดยทั่วไป แนะนำให้ใช้ Fetch API ที่เรียบง่ายและทันสมัย แต่หากจำเป็นต้องมีความเข้ากันได้กับเบราว์เซอร์หรือการติดตามความคืบหน้า คุณสามารถพิจารณาใช้ XMLHttpRequest ได้

คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย

YouTube Video