ASP.Net Web API
1 [email protected] מה זה Web API ? Web API הוא API אותו מממש השרת והוא מחזיר לקליינט Data בלבד ולא View הבקשה והתשובה הן בפרוטוקול Http\Https
הקליינטים של Web API יכולים להיות רבים : אפשר להשתמש גם בASP.Net MVC להחזיר Desktop Http\Https Application לקליינט Data אבל WEB API יותר מתאים ונוח
Mobile App Server Web API
Web Client Data
2 [email protected] דוגמאות ל Web API דוגמאות ידועות ל Web API : /https://jsonplaceholder.typicode.com ● https://openweathermap.org/api ● /https://developers.google.com/maps ● https://developers.facebook.com/docs/graph-api ● ● ועוד רבים
3 [email protected] ASP.Net Web API Microsoft מאפשרת לנו לכתוב שרת אשר מממש Web API כך שקליינטים יוכלו לפנות אליו ולקבל מידע התשתית שמאפשרת זאת נקראת ASP.Net Web API
התשתית הזו מאוד דומה ל ASP.Net MVC
ההבדל המרכזי הוא ש ASP.Net MVC יכול להחזיר View ויכול להחזיר Data ואילו ASP.Net Web API יכול להחזיר רק Data
4 [email protected] מה זה REST ? REST הוא ראשי תיבות של - Representational State Transfer REST הוא architectural pattern ליצירת API שמשתמש ב HTTP לתקשורת
REST הומצא בשנת 2000
REST נמצא בשימוש רוב האתרים שחושפים WEB API
5 [email protected] דוגמא לשימוש בREST עבור אתר הבלוגים שלנו
Resource HTTP method Expected output Response Code
OK/200 החזרת רשימת כל הבלוגים api/blogs GET/
Created/201 יצירת בלוג חדש api/blogs POST/ No Content or 200/OK/204 עדכן מידע בלוג קיים שהid הוא api/blogs/73 PUT 73/
No Content or 200/OK/204 מחק בלוג קיים שהid הוא api/blogs/73 DELETE 73/
OK/200 החזרת מידע בלוג שהid שלו הוא api/blogs/73 GET 73/
נובע מrouting עם api טבלה בעזרתה אפשר לממש controller .CRUD בשם את המידע עובר ב PUT/POST אפשר BlogsController כאשר id לא נמצא מחזירים להעביר כ querystring שנוסף ל url או ב body של הrequest 404/Not Found 6 [email protected]
שימוש ב ASP.Net Web API נוסיף ספריה api תחת ספרית Controllers של פרויקט קיים של ASP.Net MVC. לצורך הדוגמה נוסיף את זה לפרויקט בלוגים שעשינו בפרק "ASP.Net MVC + Entity Framework" (יש להסיר את השדות עם virtual ב Models)
נסמן את הספריה api ומקש ימני Add->Controllers->Web API 2 Controller - Empty
שימו לב שמלבד הcontroller נוסף בין השאר WebApiConfig.cs שמגדיר את הrouting עבור הWeb API
שימו לב שהrouting לא כולל Action !!!! למרות זאת נראה בהמשך שaction מתאים יקרא בהתאם ל http methodומספר הארגומנטים לaction 7 [email protected]
תוספות פעם בפרויקט לאחר הוספת web api controller The Global.asax.cs file in the project may require additional changes to enable ASP.NET Web API. 1. Add the following namespace references:
using System.Web.Http;
using System.Web.Routing;
2. If the code does not already define an Application_Start method, add the following method:
protected void Application_Start(){}
3. Add the following lines to the beginning of the Application_Start method: לאחר הוספת ה controller מקבלים GlobalConfiguration.Configure(WebApiConfig.Register); README ויש לבצע את ההוראות הרשומות להלן 8 [email protected]
להוסיף במידה ויש בעיית גישה מדפדפן מקומי לשרת מקומי
PM > Install-Package Microsoft.AspNet.WebApi.Cors
לעשות ב Package Manager Console var cors = new EnableCorsAttribute("*", "*", "*"); לעשות בפונקציה Register של המחלקה config.EnableCors(cors); WebApiConfig
ראה מקור
דוגמה ל Web API דוגמא לWEB API עבור אתר בלוגים מופיע כאן https://github.com/NathanKr/VS2015GitRep/tree/master/Telrad/Web/ASP.net/EF_ with_MVC/BlogsMVC_EF תחת ספרית Controllers יש ספרית api ושם יש BlogsController שיורש את ApiController
ניתן לגשת אליו גם מPostman וגם מקליינט של Angular 2 וגם מקליינט של Ionic 2
כרגע צריך לשים את המידע של PUT|POST בquerystring וזה עובד יפה
אם הaction של PUT|POST מקבל אוביקט לדוגמא Blog אז אפשר בpostman להעביר אותו ב body->raw->JSON (application/json) 10 [email protected]
קריאת כל הבלוגים // /api/blogs [HttpGet] public IEnumerable
{
return m_db.Blogs;
}
11 [email protected] קריאת בלוג אחד // GET /api/blogs/1 [HttpGet] public IHttpActionResult GetBlog(long id){
Blog blog = m_db.Blogs.Find(id);
if (blog == null){
return NotFound();
}
return Ok(blog);
} 12 [email protected]
יצירת בלוג // POST /api/blogs [HttpPost] public IHttpActionResult CreateBlog(string title,string description){
מאפשר גישה דרך {;()if (!validationIsOk(title,description)){ return BadRequest querystring ב request Blog blog = new Blog { Title = title , Description = description };
m_db.Blogs.Add(blog);
m_db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = blog.Id }, blog);
}
יצירת בלוג - גישה שניה // POST /api/blogs העברת אוביקט מסוג }(HttpPost] public IHttpActionResult CreateBlog(Blog blog] Blog מאפשרת השמתו ב request ב body כאוביקט if ((blg != null) && !validationIsOk(blog.Title, blog.Description)){ JSON אבל לא כquerystring return BadRequest();
}
m_db.Blogs.Add(blog);
m_db.SaveChanges();
return CreatedAtRoute("DefaultApi", new { id = blog.Id }, blog);
} 14 [email protected]
עריכת בלוג // PUT /api/blogs/4 -> update blog with id 4 [HttpPut] public IHttpActionResult UpdateBlog(long id, string title,string description){ מאפשר גישה דרך if (!validationIsOk(title,description)){ return BadRequest();} querystring ב request
Blog blog = m_db.Blogs.Find(id);
if (blog == null){ return NotFound();}
blog.Title = title;blog.Description = description;
m_db.SaveChanges();
return StatusCode(HttpStatusCode.NoContent);
}
עריכת בלוג - גישה שניה // PUT /api/blogs/4 -> update blog with id 4 [HttpPut] public IHttpActionResult UpdateBlog(long id,Blog blg){ העברת אוביקט מסוג Blog מאפשרת השמתו ב request if ((blg != null) && !validationIsOk(blg.Title, blg.Description)){return BadRequest();} בbody כאוביקט JSON אבל לא כif (id != blg.Id){return BadRequest();} querystring
Blog blog = m_db.Blogs.Find(blg.Id);
if (blog == null){return NotFound();}
blog.Title = blg.Title;blog.Description = blg.Description;
m_db.SaveChanges();
return StatusCode(HttpStatusCode.NoContent);
} 16 [email protected]
מחיקת בלוג // DELETE /api/blogs/4 -> delete blog with id 4 [HttpDelete] public IHttpActionResult DeleteBlog(long id){ Blog blog = m_db.Blogs.Find(id); if (blog == null){
return NotFound();
}
m_db.Blogs.Remove(blog);
m_db.SaveChanges();
return Ok(blog);
} 17 [email protected]