Web Api service part 2 Routning og Action

Web. Api service part 2 Routning og Action Simpel test-client (javascript) Session og Application data

Routning – reduceret med parametre Routning binder uri adressen med controler. Default giver også mulighed for positionsbestemte parametre I stedet for at kalde: api/Student? id=1 Kan man angive denne sådan: api/Student/1 Se mere her: : https: //www. asp. net/web-api/overview/web-api-routing-and-actions

Routning med action Hvis man har konflikter med flere metoder har samme type og parametre (fx GET) eller blot gerne vil angive metoden kan man ændre routningen (inde i Web. Api. Config. cs) til følgende: route. Template: "api/{controller}/{action}/{id}” Nu kan uri adressen så se sådan ud: api/student/get. Student/1 Hvor metoden i Web. Api controleren Student der kaldes er Get. Student med id=1 som parameter. Se mere her: : https: //www. asp. net/web-api/overview/web-api-routing-and-actions

Med Action. Name kan man angive at action er et andet navn end metodenavnet. Hvis man bruger standart navne Get, Put, Post og Delete som metodenavne kan det være en god idé public class Student. Controller : Api. Controller { [Http. Get] // hjælp til routning hvis metode ikke starter med Get [Action. Name("Get. Student. By. ID")] public Models. Student Get. Student (int id) { ……………………. . } [Http. Get] // hjælp til routning hvis metode ikke starter med Get [Action. Name("Get. Student. By. Age")] public Models. Student[] Get. Student. Age (int age) { ……………………. . } Se mere her: : https: //www. asp. net/web-api/overview/web-api-routing-and-actions

Testing Web. Api with simple javascript in html file <script> // Testing of Web. Api services // Place this content in a HTML page on the website with you Web. Api services // Running in Internet Explorer you might also debug it function Web. Api. Request(api. Uri, request. Type, http. Body. Txt) { // api. Uri : Web. Api fx "http: //localhost: 35038/api/Regne? a=5&b=7" or "/api/Regne? a=5&b=7" // request. Type : "GET", "POST", "PUT" or "DELETE" // http. Body. Txt : "data {'Id': 2, 'Name': 'My New Name'}" document. writeln(request. Type + " request " + api. Uri + "<br/>") // alert(request. Type + " request" + api. Uri); http. Req = new XMLHttp. Request(); http. Req. onloadend = onloadend_action; // set callback function http. Req. open(request. Type, api. Uri, false); // here synchronous http. Req. set. Request. Header("Content-Type", "application/json"); http. Req. send(http. Body. Txt); //Async callback function onloadend_action() { var response. Txt = http. Req. response. Text; document. writeln("response: <br/>" + response. Txt+"<br/>") // alert("response: rn" + response. Txt); } } // Continue on next slide

Testing Web. Api with simple javascript in html file // Continue from previous slide // main function /global - her you make your call for testing your Web. Api // Insert your test for Web. Api here - must be on same site as this html-script-file //Ecamples of call // Web. Api. Request("http: //localhost: 35038/api/Regne? a=5&b=7", "GET", "json", null); Web. Api. Request("api/Regne? a=5&b=7", "GET", null); document. writeln("<br/>Begin of test 4<br/>") Web. Api. Request("api/Student? id=1", "GET", null); document. writeln("<br/>Begin of test 5<br/>") Web. Api. Request("api/Student? id=1", "PUT", "{'Id': 2, 'Name': 'My New Name'}"); document. writeln("<br/>End of test<br/>") </script>

Session i Web. Api Som udgangspunkt bør man lade Web. Api services være stateless. I forbindelse med at vi ikke ønsker at gemme i en database i undervisningen, men blot holde data i ram, kan vi dog have glæde at Session også til Web. Api. Det bliver mere aktuelt når vi skal lave Web UI (MVC), men så kender du det allerede fra Web. Api. Det kræver dog lige for Web. Api en tilpasning i Global. asax

Tilgang til Session og Application objekterne For at tilgå Session og Application skal vi først have fat på Http. Context. Denne er direkte tilgængelig i WCF men i Web. Api skal den hentes fra Request klassen. var http. Context = Request. Properties["MS_Http. Context"] as System. Web. Http. Context. Wrapper; Du har nu adgang med http. Context. Session http. Context. Application Du kan bruge Session objektet til at gemme data for den enkelte klient og Application til data fælles for alle klienterne. Begge giver mulighed for gemme data med en key. Der kræves ikke serialisering da data er i ram.
![Http. Context var http. Context = Request. Properties["MS_Http. Context"] as System. Web. Http. Context. Http. Context var http. Context = Request. Properties["MS_Http. Context"] as System. Web. Http. Context.](http://slidetodoc.com/presentation_image_h2/7bf786dacdb76d9c71d80f61b4ff3f0d/image-9.jpg)
Http. Context var http. Context = Request. Properties["MS_Http. Context"] as System. Web. Http. Context. Wrapper; if (http. Context. Application != null) { try { http. Context. Application. Lock(); if (http. Context. Application["TEST"] == null) ……………………. } finally { http. Context. Application. Un. Lock(); } } Hvis du skal have adgang til Application bruges Http. Context Der ikke er tilgængelig direkte i controleren, men kan tilgås som vis her. Husk at låse på Application ved tilgang og ændring. Husk Un. Lock i finally for at sikre det altid sker Undgå at gemme mange data direkte i Application men lav din egen klasse til disse. Fx lav en klasse for en samling objekter, hvor låsning så sker her. Således at Application låses mindst muligt. Overvej brug af Static data frem Application. Husk også at REST / Web API bør som udgangspunkt være stateless I undervisningssammenhæng vil vi dog vælge data i memory for ikke også at skulle inddrage databaser hver gang – så vi kan holde fokus
- Slides: 9