Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)



Hasonló dokumentumok
Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Webes alkalmazások fejlesztése 10. előadás. Webszolgáltatások tesztelése (ASP.NET Core) Cserép Máté

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Models are not right or wrong; they are more or less useful.

WWW Kliens-szerver Alapfogalmak Technológiák Terv. Web programozás 1 / 31

RIA Rich Internet Application

Többrétegű műszaki nyilvántartás. NETinv

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése

Bevezető. Servlet alapgondolatok

Webszolgáltatások (WS)

Debreceni Egyetem Informatikai Kar. Szolgáltatás-orientált programozás az Oracle-ben

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

A PHP nyelv alapjai. Web-Sky Consulting Kft Tóth Imre 2009

Access adatbázis elérése OLE DB-n keresztül

WebSphere Adapters. 6. változat 2. alváltozat. WebSphere Adapter for SAP Software felhasználói kézikönyv 6. változat 2. kiadás

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Webes alkalmazások fejlesztése 9. előadás. Webszolgáltatások felhasználása (ASP.NET Core &.NET Framework)

Objektumorientált programozás C# nyelven III.

Eddig még nem használt vezérlőket is megismerünk: PlaceHolder, RadioButtonList.

A SZOFTVERTECHNOLÓGIA ALAPJAI

Webes alkalmazások fejlesztése 2. előadás. Webfejlesztés MVC architektúrában (ASP.NET) Webfejlesztés MVC architektúrában Fejlesztés ASP.

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben

Flash és PHP kommunikáció. Web Konferencia 2007 Ferencz Tamás Jasmin Media Group Kft

!!" KÉSZÍTK: ERDÉLYI LAJOS KOLLÁR NÁNDOR WD6OGW BUK8Y7

Webes alkalmazások fejlesztése 10. előadás. Szolgáltatás alapú rendszerek megvalósítása (ASP.NET WebAPI) Cserép Máté

SZAKKÉPZÉSI KERETTANTERV a(z) MOBILALKALMAZÁS FEJLESZTŐ SZAKKÉPESÍTÉS-RÁÉPÜLÉSHEZ

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

117. AA Megoldó Alfréd AA 117.

C# osztályok. Krizsán Zoltán

Java Servlet technológia

Szoftvertechnológia alapjai Java előadások

API tervezése mobil környezetbe. gyakorlat

Bánsághi Anna

Adatbázisok webalkalmazásokban

.NET Microsoft.Net Framework

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Biztonság java web alkalmazásokban

Osztott alkalmazások fejlesztési technológiái Áttekintés

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet. Java Web technológiák

Programozási nyelvek Java

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

ASP.NET 2.0 (Whidbey)

JAVA webes alkalmazások

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

MVC. Model View Controller

Osztály és objektum fogalma

WEB-PROGRAMOZÁS II. 1. Egészítse ki a következő PHP kódot a következők szerint: a,b,c,d: <?php. interface Kiir { public function kiir();

Webszolgáltatások kommunikációs overhead-jének becslése

Programozási technológia II 3. előadás. Objektumorientált tervezés Giachetta Roberto

Bánsághi Anna

Szolgáltatás Orientált Architektúra és több felhasználós adatbázis használata OKF keretein belül. Beke Dániel

Mobil Informatikai Rendszerek

Felhasználói kézikönyv Bázis, Aktív, Portál és Portál+ csomagokhoz

MailMasterPlus API. fejlesztői dokumentáció

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

KROMESCH SÁNDOR APP FELHŐ. API-k és Webszolgáltatások a Cloudban. Magyarországi Web Konferencia November 8.

Webes alkalmazások fejlesztése 6. előadás. Állapotfenntartás (ASP.NET) 2015 Giachetta Roberto

2. fejezet Hálózati szoftver

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

INFORMATIKAI ALAPISMERETEK

Riak. Pronounced REE-ahk. Elosztott adattároló eszköz. Molnár Péter

Programozás C++ -ban 2007/4

C#, OOP. Osztályok tervezése C#-ban

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

Objektumorientált programozás C# nyelven

Web Services. (webszolgáltatások): egy osztott alkalmazásfejlesztési plattform

Mikor? Milyen alkalmazásnál?

Feladatok cím szerint

OEP Betegéletút lekérdezés háziorvosok és vénytörténet lekérdezés patikák számára. API dokumentáció. verzió: 2.01

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

Collections. Összetett adatstruktúrák

Adatbázisok* tulajdonságai

Testreszabott alkalmazások fejlesztése Notes és Quickr környezetben

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

Java Business Integration szolgáltatásalapú architektúra JavaEE környezetben. Simon Géza Zsemlye Tamás

Symfony kurzus 2014/2015 I. félév. Controller, Routing

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

KLIENS-SZERVER ALAPÚ ERLANG PROGRAMOK TRANSZFORMÁCIÓJA ERLANG OTP SÉMÁRA

Web programoz as

Magas szintű programozási nyelvek 2 Előadás jegyzet

Térinformatikai és távérzékelési alkalmazások fejlesztése. Szoftverek minőségbiztosítása. Szoftverek minőségbiztosítása Verifikáció és validáció

Borkereskedő. Dokumentáció a Programozási módszertan elmélete című tárgy beadandó programjához. Magyar Attila mattila@inf.elte.hu

Eseményvezérelt alkalmazások fejlesztése II 4. előadás. Windows Forms alkalmazások architektúrája és tesztelése. Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése II. A.NET keretrendszer és a C# programozási nyelv. Objektumorientált programozási nyelvek A Smalltalk nyelv

Webes alkalmazások fejlesztése 6. előadás. Weblapok fejlesztése és architektúrája (ASP.NET)

Java és web programozás

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozási nyelvek Java

XML sémanyelvek Jeszenszky, Péter

MicroSigner Közvetítő Szerver fejlesztői dokumentáció

A WEB programozása - JSP1 dr.gál Tibor őszi félév

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

Szolgáltatásorientált rendszerintegráció. SOA-alapú rendszerintegráció. Web-szolgáltatások: SOAP, WSDL

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

Webes alkalmazások fejlesztése. 9. előadás Bevezetés az ASP.NET MVC keretrendszerbe

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Webes alkalmazások fejlesztése 8. előadás (ASP.NET WebAPI) 2016 Giachetta Roberto groberto@inf.elte.hu http://people.inf.elte.hu/groberto A webszolgáltatás A webszolgáltatás (web service) olyan protokollok és szabályok gyűjteménye, amely lehetővé teszi alkalmazások közötti platform független adatcserét hálózaton keresztül azaz a rendszernek egy, vagy szolgáltatója (service provider) biztosítja a funkcióknak olyan felületét, amelyet a fogyasztók (service consumer) elérhetnek a fogyasztó lehet bármilyen alkalmazás, weblap, a kommunikációra számos protokollt és megoldást használhat, pl. SOAP (Simple Object Access Protocol) és WSDL (Web Services Description Language), vagy REST lehetővé teszi a szolgáltatásorientált architektúra (Service Oriented Architecture, SOA) létrehozását ELTE IK, Webes alkalmazások fejlesztése 8:2 REST A REST (Representational State Transfer) egy szoftver architektúra típus, amely lehetővé teszi skálázható, nagy teljesítményű elosztott hálózati alkalmazások fejlesztésére elsősorban HTTP alapon kommunikál alapvető HTTP utasítások (GET, POST, PUT, DELETE, ) segítségével megszorításokat ad a rendszernek: kliens-szerver modell, egységes interfész, állapotmentes kommunikáció, kiegészíthetőség (code on demand), a támogató szoftverek a RESTful alkalmazások ASP.NET WebAPI Az ASP.NET WebAPI egy RESTful alkalmazások fejlesztését lehetővé tevő keretrendszer az MVC architektúrát valósítja meg, a tevékenységeket vezérlők felügyelik, amelyek adott erőforrásra és utasításra reagálnak az adatokat alapértelmezetten JSON (Javascript Object Notation) formátumban továbbítja, de a kliens kérésének megfelelően automatikusan tudja a formátumot módosítani könnyen integrálható az ASP.NET MVC webalkalmazásokkal NuGet-ből telepíthető (ASP.NET WebAPI csomag) ELTE IK, Webes alkalmazások fejlesztése 8:3 ELTE IK, Webes alkalmazások fejlesztése 8:4 JSON A JSON egy egyszerű formátum objektumok szöveges leképezése, pl.: // objektum "id": 1234, // attribútum "group": "tool", "name": "hammer", "resposible": "name" : "John", // összetett attribútum "materials": [ // tömb attribútum "name": "steel", ] A vezérlőkben (ApiController) valósítjuk meg a HTTP akcióműveleteket (Get, Post, ) a visszatérési érték a HTTP válasz törzsébe (body) kerül, ekkor egy OK (200) válasz készül amennyiben nincs visszatérési érték (void), akkor egy No Content (204) válasz kerül kiküldésre a műveletek feloldása az elérési útvonal leképezésének (HttpRoute) megfelelően történik, alapértelmezetten a <domain>/api/<vezérlő>/<paraméterek> formában a műveletek csak korlátozottan túlterhelhetőek az erőforrás címe mellett tartalmat is szolgáltathatunk, amit a kérés törzsébe helyezünk (FromBody) ELTE IK, Webes alkalmazások fejlesztése 8:5 ELTE IK, Webes alkalmazások fejlesztése 8:6 1

public class ProductsController : ApiController IList<string> products; // modell public IEnumerable<string> Get() return products; // összes termék lekérése // elérés: GET /api/products/1 public string Get(int id) return products[id]; // adott termék lekérése // elérés: POST /api/products/ public void Post([FromBody] string product) // meg kell adnunk, hogy a tartalom a // törzsben található products.add(product); // elérés: DELETE /api/products/1 public void Delete(int id) products.removeat(id); ELTE IK, Webes alkalmazások fejlesztése 8:7 ELTE IK, Webes alkalmazások fejlesztése 8:8 Konfiguráció A WebAPI használatba vétele előtt az ASP.NET alkalmazást megfelelő konfigurációval (elsősorban az útvonal feloldás leírásával) kell ellátnunk az útvonalelérés konfigurációját a WebApiConfig osztály Register művelete végzi (az App_Start könyvtárban) : config.routes.maphttproute( name: "DefaultApi", routetemplate: "api/controller/id", ); az Application_Start eseménykezelőben ezt a műveletet át kell adnunk a globális konfigurációnak: GlobalConfiguration.Configure( WebApiConfig.Register); A webszolgáltatás műveletei nem csak primitív típusokat, de összetett, adatátviteli objektumokat (Data Transfer Object, DTO) is közölhetnek DTO bármilyen objektum lehet, ami szérializálható (az elvárt formátumban), azaz leképezhető primitív értékekből álló felépítésre a felépítését úgy kell megválasztanunk, hogy az belső adatokat, illetve szükségtelen, vagy körkörös hivatkozásokat (pl. entitásobjektum esetén) ne tartalmazzon visszaadhatunk egyedileg konfigurált HTTP üzenetet is (HttpResponseMessage), amelyet aszinkron módon is létrehozhatunk (IHttpActionResult) ELTE IK, Webes alkalmazások fejlesztése 8:9 ELTE IK, Webes alkalmazások fejlesztése 8:10 public class Product // DTO típus public Int32 Id get; set; public String Name get; set; public class ProductsController : ApiController public IEnumerable<Product> Get() return products; // összes termék lekérése public class ProductsController : ApiController public HttpResponseMessage Get() return new HttpResponseMessage() // egyedileg összeállított üzenet StatusCode = HttpStatusCode.OK, Content = new ObjectContent<Product>( products, Configuration.Formatters.JsonFormatter) // megadjuk a kódot és a tartalmat ; ELTE IK, Webes alkalmazások fejlesztése 8:11 ELTE IK, Webes alkalmazások fejlesztése 8:12 2

A HTTP műveletek társítása megfeleltetése vezérlő műveleteknek lehet automatikus, a név kezdőszelete alapján történik, pl.: public class ProductsController : ApiController // elérés: GET /api/products/1 public Product GetSingleProduct(int id) // elérés: DELETE /api/products/1 public void DeleteProduct(int id) ELTE IK, Webes alkalmazások fejlesztése 8:13 manuális, attribútumok segítségével megjelölve a HTTP műveletet (HttpGet, HttpPost, HttpDelete, ) és az elérési útvonalat (Route), pl.: public class ProductsController : ApiController // elérés: GET /api/myproducts/1 [Route("api/myproducts/id")] [HttpGet] public Product FindProduct(int id) a manuális útvonal feloldást külön kell jeleznünk: config.maphttpattributeroutes(); ELTE IK, Webes alkalmazások fejlesztése 8:14 az útvonal megjelölésénél lehetőségünk van előtagot adni a vezérlőnek (RoutePrefix) tetszőleges módon elhatárolni a paramétereket (további útvonal komponensek hozzáadásával) megszorításokat adni a paraméterekre, úgymint típus (bool, datetime, decimal, double, float, guid, int, long), hosszúság (length, maxlength, maxlength), érték (min, max, range, values), alak (alpha, regex) meghatározni a prioritást (RouteOrder), amennyiben több műveletre is illeszkedik az útvonal a típusmegjelölés lehetővé teszi a túlterhelést, mivel a típusnak megfelelő műveletet tudja futtatni a rendszer pl.: [RoutePrefix("api/myproducts")] // előtag public class ProductsController : // elérés: GET /api/myproducts/1 [Route("id:int:min(1)")] public Product GetProduct(int id) // elérés: GET /api/myproducts/tools/item/1 [Route("group:values(tools machines)/ item/id:int:min(1)")] public Product GetProduct(string group, int id) ELTE IK, Webes alkalmazások fejlesztése 8:15 ELTE IK, Webes alkalmazások fejlesztése 8:16 Feladat: Valósítsuk meg egy utazási ügynökség weblapját, amelyben apartmanok között böngészhetünk. Tervezés: könnyítsük meg a foglalást az által, hogy a dátumot egy naptár (gldatepicker) segítségével lehessen kiválasztani a dátumkiválasztó automatikusan lekérdezi (jquery segítségével) a szolgáltatástól, mely napok szabadok a szolgáltatása vezérlője (RentDateApiController) egy műveletet biztosít (Get) a megfelelő napok lekérdezésére magát a lekérdezést a modell (TravelService) biztosítja (GetRentDates), amely adott egy hónap körüli ELTE IK, Webes alkalmazások fejlesztése 8:17 ELTE IK, Webes alkalmazások fejlesztése 8:18 3

Megvalósítás (RentDateApiController.cs): [RoutePrefix("api/rentdate")] // útvonal feloldás megadása public class RentDateApiController : ApiController [Route("apartmentId/year/month")] // útvonal feloldás megadása public IEnumerable<DateTime> Get( Int32? apartmentid, Int32? year, Int32? month) ELTE IK, Webes alkalmazások fejlesztése 8:19 Megvalósítás (Rent/Index.cshtml): <script type="text/javascript"> $(window).load(function () jquery.getjson("api/rentdate/" + @Model.Apartment.Id + "/" + year + "/" + month, function (data) options.selectabledates = parsedates(data); ); ELTE IK, Webes alkalmazások fejlesztése 8:20 Visszajelzés és hibakezelés A vezérlő nem csupán az alapértelmezett, de tetszőleges HTTP kóddal tud válaszolni a kérésekre, amennyiben általános visszatérési típust specifikálunk (IHttpActionResult) előre definiált visszatérési függvényekkel könnyedén megadhatjuk az eredményt: Ok(<content>), Created(<location>, <content>), Redirect(<location>), NotFound(), Unauthorized(), BadRequest(<message>), Conflict(), InternalServerError(<exception>)) a megfelelő visszajelzés a hibakezelés szempontjából is fontos (amennyiben nem kezeljük le a műveletben dobott kivételeket, INTERNAL SERVER ERROR (500) üzenetet küld a szolgáltatás) ELTE IK, Webes alkalmazások fejlesztése 8:21 Visszajelzés és hibakezelés pl.: public IHttpActionResult GetProduct(int id) try return Ok(product); // amennyiben sikeres volt a // lekérdezés, 200-as kód catch return NotFound(); // ellenkező esetben 404-es kód ELTE IK, Webes alkalmazások fejlesztése 8:22 Tesztelés A webszolgáltatások tesztelése elvégezhető manuálisan, kliens oldalon, a kérések küldését biztosító program (böngésző) segítségével automatikusan, kliens oldalon, a kérések küldését biztosító osztály (pl. HttpClient) segítségével automatikusan, szerver oldalon, a vezérlő műveleteinek közvetlen tesztelésével A webszolgáltatás használata a célkörnyezetben (weblap, asztali alkalmazás, ) már integrációs teszt, amelyet csak a megfelelő egységtesztek végrehajtása után kezdeményezhetünk Amennyiben függőséggel rendelkező programegységet tesztelünk, a függőséget helyettesítjük annak szimulációjával, amit mock objektumnak nevezünk megvalósítja a függőség interfészét, egyszerű, hibamentes funkcionalitással használatukkal a teszt valóban a megadott programegység funkcionalitását ellenőrzi, nem befolyásolja a függőségben felmerülő esetleges hiba at manuálisan is létrehozhatunk, vagy használhatunk erre alkalmas programcsomagot pl. NSubstitute, Moq letölthetőek NuGet segítségével ELTE IK, Webes alkalmazások fejlesztése 8:23 ELTE IK, Webes alkalmazások fejlesztése 8:24 4

Pl. : class DependencyMock : IDependency // mock objektum // egy egyszerű viselkedést adunk meg public Double Compute() return 1; public Boolean Check(Double value) return value >= 1 && value <= 10; Dependant d = new Dependant(new DependencyMock()); // a mock objektumot fecskendezzük be a függő // osztálynak ELTE IK, Webes alkalmazások fejlesztése 8:25 Moq segítségével könnyen tudunk interfészekből mock objektumokat előállítani a Mock generikus osztály segítségével példányosíthatjuk a szimulációt, amely az Object tulajdonsággal érhető el, és alapértelmezett viselkedést produkál, pl.: Mock<IDependancy> mock = new Mock<IDependancy>(); // a függőség mock objektuma Dependant d = new Dependant(mock.Object); // azonnal felhasználható a Setup művelettel beállíthatjuk bármely tagjának viselkedését (Returns(), Throws(), Callback()), a paraméterek szabályozhatóak (It) ELTE IK, Webes alkalmazások fejlesztése 8:26 pl. : mock.setup(obj => obj.compute()).returns(1); // megadjuk a viselkedést, mindig 1-t ad // vissza mock.setup(obj => obj.check(it.isinrange<double>(0, 10, Range.Inclusive))).Returns(true); mock.setup(obj => obj.check(it.isany<double>()).returns(false); // több eset a paraméter függvényében lehetőségünk van a hívások nyomkövetésére (Verify()) Feladat: Teszteljük az utazási ügynökség weblapját, azon belül pedig a szabad napokat lekérdező webszolgáltatást. egy külön tesztprojektben létrehozzuk a tesztkörnyezetet biztosító osztályt (TravelServiceTest), ezek belül pedig a Get művelet funkcionalitását teszteljük ehhez leválasztjuk az entitásmodell interfészét (ITravelAgencyEntities), amelyet szimulálunk a teszthez (ehhez a Moq programcsomagot használjuk) an entitásmodell mellett a foglalások gyűjteményét (DbSet<Rent>) is szimuláljuk, és az adatokat egy listában adjuk meg ELTE IK, Webes alkalmazások fejlesztése 8:27 ELTE IK, Webes alkalmazások fejlesztése 8:28 Tervezés: Megvalósítás (TravelServiceTest.cs): [TestMethod] public void TravelServiceGetRentDatesTest() // ellenőrzések júniusra DateTime[] result = service.getrentdates(0, 2016, 06).ToArray(); foreach (DateTime date in _data. Where(rent => rent.apartmentid == 0). Select(rent => rent.startdate)) Assert.IsFalse(content.Contains(date)); ELTE IK, Webes alkalmazások fejlesztése 8:29 ELTE IK, Webes alkalmazások fejlesztése 8:30 5