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