MODUL 8 - LEKCIJA 2

Web API 2 Integracija

Web API kontroleri, JSON komunikacija, RESTful servisi i Open Data portali

⏱️ Trajanje: ~3 časa 📚 Nivo: Srednji 🎯 Praktični primjeri: 5

📖 Šta je Web API 2 i zašto nam treba?

Klasični ASP.NET MVC kontrolleri prvenstveno vraćaju HTML stranice (Views). Međutim, u modernim sistemima javne uprave imamo potrebu za razmjenom sirovih podataka (bez UI-a) sa drugim sistemima, mobilnim aplikacijama ili "Single Page Application" (SPA) frontend okvirima.

ASP.NET Web API 2 je okvir koji olakšava izgradnju HTTP servisa (RESTful APIs) koji dopiru do širokog spektra klijenata. Standardno, Web API vraća JSON ili XML podatke.

🏛️ Javna Uprava i "Open Data" (Otvoreni podaci)

Mnoge vlade implementiraju Open Data portale gdje se mašinski čitljivi podaci (budžeti, javne nabavke, šifrarnici) stavljaju na raspolaganje građanima i kompanijama. Web API je idealna tehnologija za realizaciju takvih portala, jer nudi standardizovan pristup preko HTTP metoda.

Mobile App SPA (React/Vue) 3rd Party Portal HTTP/JSON Web API 2 SQL DB

🎯 Kreiranje API Controllera

Za razliku od klasičnog MVC-a, Web API kontroleri nasljeđuju klasu ApiController (iz System.Web.Http namespace-a) i njihove metode obično vraćaju podatke direktno ili putem IHttpActionResult.

Koristimo Attribute Routing ([Route], [RoutePrefix]) kako bi eksplicitno definisali URL strukturu API-ja, što je preporuka za održiv kod.

🛠️ Web API Controller (Open Data)
using System.Web.Http;
using System.Linq;

namespace JavnaUpravaApp.Controllers.Api
{
    // Cijeli kontroler ima bazni URL: /api/public
    [RoutePrefix("api/public")]
    public class PublicDataController : ApiController
    {
        private ApplicationDbContext db = new ApplicationDbContext();

        // 1. GET: api/public/ministries
        [HttpGet]
        [Route("ministries")]
        public IHttpActionResult GetMinistries()
        {
            // Vraćamo samo odabrane atribute, izbjegavamo slanje cijelih entiteta kako ne bi otkrili ID-eve ili osjetljive podatke
            var ministries = db.Departments
                .Select(d => new { 
                    d.DepartmentName, 
                    d.DepartmentCode,
                    Head = d.Manager.FirstName + " " + d.Manager.LastName
                })
                .ToList();

            return Ok(ministries); // Vraća HTTP 200 OK klijentu zajedno sa JSON podatcima
        }

        // 2. GET: api/public/budget/2024
        [HttpGet]
        [Route("budget/{year:int}")] // Ograničavamo rutu da 'year' mora biti integer
        public IHttpActionResult GetBudget(int year)
        {
            var budgetData = db.Budgets.Where(b => b.Year == year).ToList();
            
            if (!budgetData.Any()) 
            {
                // Ako nema podataka za tu godinu, pravilno je vratiti HTTP 404
                return NotFound(); 
            }
            
            return Ok(budgetData);
        }
    }
}

📡 Komunikacija klijenata sa API-jem

Sada kada imamo servis koji vraća podatke, možemo ga konzumirati na klijentskoj strani. Primjer ispod prikazuje kako nezavisna web stranica (ili naš vlastiti view) može povući spisak ministarstava i prikazati ih asinkrono koristeći jQuery.

🛠️ jQuery AJAX za konzumiranje API-ja
$(document).ready(function() {
    $('#btnLoadMinistries').click(function() {
        $.ajax({
            url: '/api/public/ministries', // Naš API endpoint
            type: 'GET',
            dataType: 'json',
            success: function(data) {
                var tbody = $('#ministryTable tbody');
                tbody.empty(); // Očisti prethodne podatke
                
                // Iteriramo kroz JSON niz i dodajemo redove u tabelu
                $.each(data, function(i, item) {
                    var row = '<tr>' +
                              '<td>' + item.DepartmentCode + '</td>' +
                              '<td>' + item.DepartmentName + '</td>' +
                              '<td>' + item.Head + '</td>' +
                              '</tr>';
                    tbody.append(row);
                });
            },
            error: function() {
                alert('Greška prilikom dohvaćanja otvorenih podataka!');
            }
        });
    });
});

⚙️ WebApiConfig i konverzija u JSON

Da bi Web API ispravno radio, njegove rute moraju biti registrovane u fajlu WebApiConfig.cs. U ASP.NET MVC 5 rješenjima, ovaj fajl se obično nalazi u App_Start folderu, i registruje se u Global.asax.

🛠️ WebApiConfig.cs
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 1. Uključivanje Attribute Routing-a (OBAVEZNO)
        config.MapHttpAttributeRoutes();

        // 2. Podrazumijevane rute (opcionalno ako striktno koristite atribute)
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        // 3. Forsiranje JSON formata (uklanjanje XML formattera)
        // Ovo je česta praksa kako bi API uvijek vraćao JSON umjesto XML-a
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        
        // Podešavanje konvencije povratnog JSON formata (camelCase) - moderni standard
        var jsonFormatter = config.Formatters.JsonFormatter;
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

✅ Zaključak

Web API je krucijalan most između vaših pozadinskih baza podataka (putem Entity Framework-a) i modernih eksternih sistema, SPA aplikacija ili mobilnih uređaja. U kontekstu javnog sektora, omogućava digitalizaciju usluga na najvišem arhitekturalnom nivou.