This is an old revision of the document!


Laboratorul 03: Servicii, controllere si CRUD

Scopul laboratorului

In laboratorul precedent am vazut cum se poate lucra cu baza de date prin ORM, acum ca un clientul web ajunga la datele de pe server si sa consume API-ul acestuia vom introduce in acest laborator conceptele de controller si serviciu.

Controller

Cand ruleaza aplicatia se creaza serverul HTTP, ca orice aplicatie peste HTTP trebuie sa avem declarate endpoint-urile/rutele unde se expune API-ul. Astfel, primele componete invatate aici sunt controller-ele, acestea sunt clase speciale a caror metode publice sunt apelate la accesul rutelor corespunzatoare metodei. Pentru ca framework-ul sa identifice controller-ele si rutele, se decoreaza clasa si metodele cu atribute, de exemplu [ApiController] specifica fremawork-ului ca acesta clasa trebuie sa fie folosita ca controller iar [Route(“api/[controller]”)] pus pe clasa si [HttpGet(“my-route”)] pe metoda specifica ca atunci cand se aceseaza ruta “/api/<nume_clasa_controller>/my-route” cu un HTTP GET sa se apeleze acea metoda in cauza.

Decorarea claselor si metodelor cu attribute, sau in Java cu adnotari, pentru ca acestea sau dobandeasca mai multe functionalitati, la runtime sau compiletime, se numeste AOP (Aspect-Oriented-Programming).

In cereri HTTP datele transmise catre server pot fi transferate in mai multe locatii din cerere care pot fi extrase si pasate automat ca parametri pentru metoda din controller corespunzatoare rutei. Aceste locatii se specifica folosind atribute in fata parametrilor in urmatoarele moduri:

  • Pentru parametri specificati intr-o ruta ca de exemplu “api/{type}/user/{id:guid}” metoda poate arata astfel: public Task<IActionResult> MyMethod([FromRoute] string type, [FromRoute] Guid id), aici se poate vedea si ca se pot pune constrangeri ca “id” sa fie formatat ca fiind un Guid si sa se intoarca automat cod de BadRequest catre client.
  • Parametri de url/query sunt specificatati cu [FromQuery]
  • Campurile din header-ul cererii sunt extrase prin [FromHeader]
  • Pentru form-uri campurile din form pot fi extrase prin [FromForm], un caz special este cand un camp este un fisier iar acesta poate fi extras doar cu un obiect de tip IFromFile
  • Body-ul cererii este poate fi extras doar o singura data si deserializat intr-un singur obiect fie lasand parametrul fara atribut sau cu atributul [FromBody].

Rutele apelate din backend o sa raspunda cu un obiect care o sa fie automat serializat intr-un raspuns HTTP ca JSON.

pw/laboratoare/03.1677151115.txt.gz · Last modified: 2023/02/23 13:18 by ciprian.dobre
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0