📖 Š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.
🎯 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.
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.
$(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.
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.