4.6 בקשות HTTP תרגול
תרגול - בקשות HTTP¶
כל התרגילים משתמשים ב-API של JSONPlaceholder: https://jsonplaceholder.typicode.com
תרגיל 1 - בקשת GET בסיסית¶
כתבו פונקציה getUser שמקבלת מזהה משתמש (id) ומחזירה את פרטי המשתמש מה-API.
- השתמשו ב-async/await
- בדקו
response.ok - הדפיסו את שם המשתמש והאימייל שלו
- טפלו בשגיאות עם try/catch
בדקו עם:
const user = await getUser(1);
// should print something like: "Leanne Graham - Sincere@april.biz"
await getUser(999);
// should print an error message (user not found)
תרגיל 2 - הצגת רשימה מה-API¶
כתבו פונקציה displayPosts שמביאה את כל הפוסטים (/posts) ומציגה אותם בדף HTML.
- צרו דף HTML עם
<div id="posts"></div> - עבור כל פוסט, צרו כרטיס עם כותרת וגוף
- הוסיפו הודעת "טוען..." בזמן שהבקשה מתבצעת
- טפלו בשגיאות והציגו הודעה מתאימה
תרגיל 3 - בקשת POST¶
כתבו פונקציה createPost שיוצרת פוסט חדש.
- הפונקציה מקבלת אובייקט עם
title,body, ו-userId - שלחו בקשת POST ל-
/posts - הדפיסו את הפוסט שנוצר (כולל ה-id שהשרת החזיר)
- טפלו בשגיאות
צרו טופס HTML עם שדות עבור הכותרת והתוכן, וכפתור שליחה שקורא לפונקציה.
await createPost({
title: "My First Post",
body: "Hello from the frontend!",
userId: 1
});
// should print: { id: 101, title: "My First Post", ... }
תרגיל 4 - חיפוש עם Query Parameters¶
כתבו פונקציה searchPosts שמחפשת פוסטים לפי מזהה משתמש.
- השתמשו ב-URLSearchParams כדי לבנות את ה-URL
- הנתיב:
/posts?userId=X - הציגו את מספר התוצאות ואת הכותרות
- הוסיפו פרמטר
_limitכדי להגביל את מספר התוצאות
תרגיל 5 - CRUD מלא¶
כתבו אובייקט PostService עם המתודות הבאות:
const PostService = {
getAll(), // GET /posts
getById(id), // GET /posts/:id
create(data), // POST /posts
update(id, data),// PUT /posts/:id
delete(id) // DELETE /posts/:id
};
- כל המתודות צריכות לבדוק
response.ok - כל המתודות צריכות לטפל בשגיאות
- כל המתודות צריכות להיות async
בדקו:
const posts = await PostService.getAll();
console.log(posts.length); // 100
const post = await PostService.getById(1);
console.log(post.title);
const newPost = await PostService.create({ title: "Test", body: "Body", userId: 1 });
console.log(newPost.id); // 101
await PostService.update(1, { title: "Updated", body: "New body", userId: 1 });
await PostService.delete(1);
תרגיל 6 - טיימאאוט וביטול¶
א. כתבו פונקציה fetchWithTimeout שעוטפת fetch ומוסיפה timeout.
- הפונקציה מקבלת URL, options, ו-timeout (באלפיות שנייה)
- אם הבקשה לא מסתיימת בזמן, היא מתבטלת ונזרקת שגיאה
ב. כתבו פונקציה fetchLatest שמתאימה לשדה חיפוש - אם המשתמש שולח חיפוש חדש, הבקשה הקודמת מתבטלת.
// only the last request should complete
fetchLatest("/search?q=h"); // cancelled
fetchLatest("/search?q=he"); // cancelled
fetchLatest("/search?q=hel"); // cancelled
fetchLatest("/search?q=hello"); // this one completes
רמז: שמרו את ה-AbortController הנוכחי במשתנה חיצוני.
תרגיל 7 - בקשות מקבילות¶
כתבו פונקציה getUserWithPosts שמקבלת userId ומחזירה אובייקט שמכיל את פרטי המשתמש ואת כל הפוסטים שלו.
- שלחו את שתי הבקשות במקביל עם
Promise.all /users/:idלפרטי המשתמש/posts?userId=:idלפוסטים- החזירו אובייקט בצורה:
{ user: {...}, posts: [...] } - אם אחת הבקשות נכשלת, טפלו בזה
const result = await getUserWithPosts(1);
console.log(result.user.name); // "Leanne Graham"
console.log(result.posts.length); // 10
תרגיל 8 - פונקציית עטיפה¶
בנו פונקציית עטיפה api שמספקת ממשק נקי לעבודה עם API:
- מקבלת base URL ומחזירה אובייקט עם מתודות
- תומכת ב-GET, POST, PUT, DELETE
- מוסיפה כותרות אוטומטית (Content-Type, Authorization)
- בודקת response.ok
- כוללת timeout
- מאפשרת להגדיר token
const client = createApiClient("https://jsonplaceholder.typicode.com");
// optional: set auth token
client.setToken("my-secret-token");
const posts = await client.get("/posts");
const newPost = await client.post("/posts", { title: "Hi", body: "World", userId: 1 });
await client.put("/posts/1", { title: "Updated", body: "New", userId: 1 });
await client.delete("/posts/1");