בקשה/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 בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.