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 מאפשרת לנו לכתוב שרת אשר מממש 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

ראה מקור

9 [email protected]

דוגמה ל 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/) 10 [email protected]

קריאת כל הבלוגים // /api/blogs [HttpGet] public IEnumerable GetBlogs()

{

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);

}

13 [email protected]

יצירת בלוג - גישה שניה // 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);

}

15 [email protected]

עריכת בלוג - גישה שניה // 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]