משיכת מידע מ-API
משיכת מידע מ-API באנגולר מתבצע ע"י HttpClientModule. לפני שמתחילים לעבוד צריך להוסיף את HttpClientModule למודול הראשי ולרשימת הייבוא.
ב-service עצמו שבו אנחנו מושכים את המידע נייבא את HttpClient ונכניס אותו כ-dependency ל-constructor.
אפשר להשתמש בפונקציות שמושכות את המידע מה-API התוך ה-class של הקומפוננטה עצמה, אבל מקובל לבנות קובץ service שמטפל בכל העבודה מול ה-DB וכך גםאפשר לפנות אליו מכל קומפוננטה.
מה צריך כדי לפנות ל-API?
אנחנו משתמשים ב-API על מנת להתחבר למאגר נתונים מסויים. ל-API יש כתובת שאליה ניגשים כדי לקבל את המידע.
לבקשה מ-API יש:
הכתובת שאליה מתחברים, Endpoint.
סוג הבקשה שאנחנו שולחים: get, post, put, patch, delete.
מידע נוסף שנשלח ב-Headers. לא תמיד נצטרך לגעת בו.
גוף הבקשה שאנחנו שולחים לסרבר.
שלבי התהליך
הצעדים בגישה לשרת הם:
- Http מקבל בקשה מתוך ה-service שלנו.
- אנחנו מקבלים חזרה את המידע כ-observable ומכניסים אותו ל-type המתאים.
- מבצעים Subscribe ל-observable מהקומפוננטה שבה אנחנו צריכים את המידע.
- מכניסים את המידע למשתנה מקומי ומשתמשים בו.
אם הפעולה מצליחה, נקבל ערך של הצלחה. אם לא, נקבל ערך שגיאה.
התהליך בקוד
1. שולחים את הבקשה לשרת
בקוד פה אנחנו רואים שליחה של בקשת get ל-API. ב-API תהיה נקודת קצה על פי הכתובת שהכנסנו. בדוגמא הזאת יש פנייה לקובץ JSON מקומי ולא לשרת חיצוני.
constructor(private httpClient: HttpClient){}
// The server url
private url: string = "/assets/data/employees.json";
getEmployees(){
return this.httpClient.get(this.url);
}
2. קבלת המידע בצורה הנכונה
כדי לקבל את המידע באובייקט שאנחנו רוצים ניצור Interface של האובייקט.
export interface IEmployee{
id: number,
name: string,
age: number
}
נשנה את הפונקציה ב-service כך שתתאים לאובייקט שלנו.
getEmployees(): Observable<IEmployee[]>{
return this.httpClient.get<IEmployee[]>(this.url);
}
3. שימוש במידע בקומפוננטה
public employees = [];
constructor(private employeeService: EmployeeService){}
ngOnInit(){
this.employeeService.getEmployees().subscribe(data =>
this.employees = data
);
}
עכשיו אפשר לחבר את המשתנה employees שמכיל את המידע לקובץ ה-HTML.
טיפול בשגיאות
יש לנו אפשרות לתפוס את השגיאות בדרך אל הבקשה שלנו.
public employees = [];
constructor(private employeeService: EmployeeService){}
ngOnInit(){
this.employeeService.getEmployees().subscribe(
data => {
this.employees = data
},
error => {
console.log(error.message);
}
);
}