בקשה/Fetch עם XMLHttpRequest ב-TypeScript

בקשה/Fetch עם XMLHttpRequest ב-TypeScript

מאמר זה מסביר על שימוש ב-Fetch/XMLHttpRequest ב-TypeScript.

ניתן ללמוד על איך להשתמש ב-Fetch API ו-XMLHttpRequest, כמו גם על ההבדלים ביניהם.

YouTube Video

בקשה/Fetch עם XMLHttpRequest ב-TypeScript

ב-TypeScript, בקשות HTTP מתבצעות בעיקר באמצעות שני APIs: Fetch API ו-XMLHttpRequest. באמצעות TypeScript, ניתן להוסיף בדיקת טיפוסים עבור בקשות ותשובות במהלך תקשורת אסינכרונית באמצעות ה-APIs הללו, מה שמאפשר כתיבת קוד בטוח יותר. להלן נציג כיצד להשתמש בכל אחד מהם.

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

ניתן לטפל בשגיאות בקשה באמצעות האירוע 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 Video