ASP.Net Web API
Total Page:16
File Type:pdf, Size:1020Kb
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 ראה מקור 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/json) 10 [email protected] קריאת כל הבלוגים // /api/blogs [HttpGet] public IEnumerable<Blog> 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] .