קונטרולרים Asp.Net core Web api

תזכורת – מהם קונטרולרים ?

קונטרולרים הם הקלאסים שמבצעים את הפעולות בפועל.

בתבנית הבסיסית שנותן לנו visual studio מופיעים 2 מאפיינים מעל שם המחלקה

 [Produces("application/json")]
 [Route("api/Post")]
 public class PostController : Controller

המאפיין Produces מגדיר מה יוחזר מהקונטרולר.

המאפיין Route מגדיר את ניתוב ברירת המחדל לקונטרולר הזה, כאשר הפונקציות ( actions ) עצמן, שם הפוקנציה יהיה המשך ה-URL.

הזרקת התלות של החיבור לדאטאבייס

ב-asp.net core , החיבור לדאטאבייס מוגדר כ-service שצריך להזריק לכל מחלקה שזקוקה לו.

לצורך ההזרקה שלו, פשוט נוסיף אותו כפרמטר של הקונסטרקטור.

 private readonly MyDbContext _appContext;

 public PostController(MyDbContext db)
 {
 _appContext = db;
 }

יצירת הפונקציות = נקודות הגישה של ה-Api

כדי להמחיש את בניית הפונקציות פשוט אדגים פה כמה פונקציות, רובן ברורות מעצמן.

[HttpGet]
public IActionResult Get()
{
 return Ok(this.db.Post.ToList());
}

[HttpGet("{id}")]
public IActionResult Get(int id)
{
 return Ok(this.db.Post.FirstOrDefault(x=>x.Id == id));
}

יש לנו פה 2 פונקציות, שברור מהמאפיין HttpGet, שהם עובדות דרך GET.

הפונקציה הראשונה לא מצפה לקבל כלום, ולכן כאשר נגלוש אל localhost/api/post

נקבל את התוצאה של הפונקציה הראשונה כברירת מחדל – כלומר את כל הרשומות.

הערה : במקומות שבהם כתבתי localhost -זה יכול להשתנות כמובן לפי הפורט שקובע עבורכם הויזואל סטודיו.

הפונקציה השניה, היא OverLoad של הראשונה, עם חתימה מעט שונה – יש בה פרמטר של id שמאפשר לסנן את הרשומה המוחזרת.

כלומר אם נגלוש אל localhost/api/post?id=5 אז נקבל את רשומה 5.

כעת דוגמא לפונקציה שמקבלת POST   ( שימו לב שגם המודל של Entity אצלי בדוגמא נקרא Post, זה יכול קצת לבלבל, אבל כשמבינים את העיקרון – זה מובן).

[HttpPost]
public IActionResult Post([FromBody] Post post)
{
 this.db.Post.add(Post);
 this.db.SaveChanges();
 return Created("Get",post);
 
}

ברגע שנפנה בפעולת POST אל localhost/api/post אז נשלח בתוך ה-body של ה-Request אובייקט json שיכיל את המאפיינים של המודל post שלנו (לא להתבלבל עם הפועל POST של http).

ואנחנו נכניס אותו לדאטאבייס , ונחזיר תשובה שהוא נוצר בהצלחה.

מעט שליטה בשמות של נקודות הגישה (EndPoints ) של ה-Api – כלומר Routing

יש הרבה מאוד שליטה ב-Routing של Asp.net core web api , אני לא אעבור על הכל, רק אדגים אפשרות אחת לשלוט ב-url.

בדוגמאות הקודמות שלנו , כלל לא משנה איך קראנו לפונקציה, אלא כיוון שלא הוגדר שום route מיוחד, אז הפריימוורק web api הניח שיש פונקציה אחת שמטפלת בפעולת GET ואחת שמטפלת ב-POST, ולמעשה הסיבה היחידה שהפריימוורק לא החזיר שגיאה על הפונקציה השניה שטיפלה ב=GET, היא כיוון שהיא קיבלה פרמטר, אז הפריימוורק "הבין" מתי לפנות לכל אחת מהפונקציות.

אבל במקרה בו נרצה להחליט בעצמנו איך יקראו ה-EndPoints אז אחת השיטות היא לשים את השם הרצוי בתוך פועל ה-Http

למשל הדוגמא הבאה מהאתר של מיקרוסופט , ממחישה זאת :

[HttpGet("/products")]
public IActionResult ListProducts()
{
 // ...
}

[HttpPost("/products")]
public IActionResult CreateProduct(...)
{
 // ...
}

הערה חשובה :  בדוגמא שהבאתי כאן , הוספתי סימן "קו נטוי" / לפני הניתוב, מה שגורם לכתובת למעשה להיות ממש כמו שהיא כתובה בסוגרים , כלומר זה http://localhost/products , וזה לא  משתרשר לפי ה-attribute של הקלאס (אם היה כזה) .

אבל אם נוריד את סימן הקו נטוי בהתחלה, אז זה ישתרשר בהמשך לניתוב (route) שמוגדר לקונטרולר.

אז נניח והקונטרולר שלנו מתחיל כמו הדוגמא הראשונה בפוסט הזה,

אז התוצאה תהיה כך http://api/post/products .

שליפה של נתונים מתוך הכתובת \ body וכדומה.

כדי לשלוף נתונים מתוך הכתובת, כלומר מתוך ה- query string , אז ברוב המקרים מספיק פשוט להוסיף פרמטר של הפונקציה שמקביל בשמו לפרמטר שמגיע בכתובת.

יחד עם זאת, אם רוצים לקחת מתוך כתובת "יפה" ללא הסימן שאלה, וכדומה, אז אפשר להוסיף ברשימת הפרמטרים כל מיני מאפיינים שמאפשרים לשלוט במקור של הפרמטר, כלומר מאפשרים לומר מהיכן יגיע הפרמטר:

להלן 2 דוגמאות :

 public IActionResult Update2([FromRoute] int id, [FromBody] Post post)

ישנם עוד כמה אפשרויות, וכולן נסקרות להרחבה במקורות למטה.

בפוסט אחר, הבאתי דוגמאות רבות לפונקציות שמבצעות CRUD בקונטרולרים, וכיצד להחזיר תשובות Http שונות בכל מיני צורות.

יצירת Controllers באופן אוטומטי בעזרת Visual Studio

כשעובדים עם ויזואל סטודיו, שווה לציין, שקיימת אפשרות לייצר אוטומטית קונטרולרים לכל מודל שנרצה.

  • לוחצים מקש ימני על מקום מסוים בפרויקט
  • בוחרים ב- Add
  • Controller
  • ובמסך שיפתח נבחר בקונטרולר עבור ASP.NET Web Api  עם כל התכונות, ועם Entity וכו'
  • ואז בוחרים מודל רלוונטי, ו-Context, ובזה סיימנו.
  • כדאי כמובן לעבור על הקוד שנוצר לפני שמשתמשים בו.

מקורות להרחבה :

באופן כללי

https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api

https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing

לגבי Attributes ששולטים במקור של הפרמטרים :

https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

Asp.Net Core Model Binding: Controlling The Binding Source

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *