Modul 8 - Lekcija 2
Web API kontroleri, JSON Komunikacija, i Open Data REST portali
⏱️ Trajanje: ~3 časa | 📚 Nivo: Srednji | 🎯 Praktični primjeri: 5
Dok obični MVC Ponaša vraća teški HTML Grafički Interfejs svojim klijentima, ASP.NET Web API 2 ima zadatak rješavanja moderne "Service Oriented Architecture" vraćajući isključivo sirove JSON (mašinski-čitljive) podatkovne nizove za potrebe razmjene informacija!
Web API idealan je za sprovedbu "Open Data" servisa. Preko API EndPoint servisa vi slobodno otvarate prozor vašeg SQL Servera (Npr Baze Javnih Nabavki Ministarstava) cijelom svijetu nebi li Programeri van vaše institucije izrađivali vlastite SPA Aplikacije i analizirali te JSON nizove!
ApiController bazna klasa ključna je specifičnost ovog formata! API Metode koristeći RoutePrefix i Attribute Routing definišu tačan Web Link kojem će klijent priopćiti HTTP METODU (GET/POST/PUT/DELETE)
using System.Web.Http; // Zasebna linija
[RoutePrefix("api/otvoreni-podaci")] // Bazni Prefix Ruta za klase
public class OgraniceniPodatciController : ApiController
{
private ApplicationDbContext db = new ApplicationDbContext();
// /api/otvoreni-podaci/spisak
[HttpGet]
[Route("spisak")]
public IHttpActionResult PreuzmiJavneUstanove()
{
// Pazite sta vracate! Vracamo anonimnu C# klasu limitiranih Parametara da sakrijemo ID / Sifre
var selekcije = db.Ustanove.Select(u => new {
Sifra = u.DepCode,
Naziv = u.Naziv
}).ToList();
return Ok(selekcije); // Vraća status 200 i konvertovan čitavi niz objekata u JSON Stranični Array!!
}
}
Javascript sa neke druge strane domene spaja se (konzumira) vašeg otvorenog API Controllera na isti
JQUERY ajax način
koji smo prikazivali unutar custom asinkronog podizanja u prethodnoj lekciji!
$(document).ready(function() {
$('#btnSkidajPodatke').click(function() {
$.ajax({
url: '/api/otvoreni-podaci/spisak', // Adresa Navedenog Controllera (REST endpoint)
type: 'GET',
dataType: 'json', // JSON formiranje ocekivamo
success: function(pruzetiNiz) {
// For petlja Javascripta (Each) koja generira Tabbularne HTML prostore sa JSON Nizom Data Objekata (pruzetiNiz)
$.each(pruzetiNiz, function(brojacIndex, rowPodatak) {
var novHtmlTrElement = '<tr><td>' + rowPodatak.Sifra + '</td><td>' + rowPodatak.Naziv + '</td></tr>';
$('#htmlTabelaRezultata').append(novHtmlTrElement);
});
}
});
});
});
U App_Start/WebApiConfig.cs mi postavljamo opsta generalna pravila ponašanja svih
API Controllera koji se oslanjanju na ovu instancu (Zahtjev za CamelCase imenovanja i blokada XML
konverzija).
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// OBAVEZNO paljenje atributerskog routinga
config.MapHttpAttributeRoutes();
// Ovo ce forsirano ukinuti mogunost da API pokusa vratiti sirovi glomazni XML
// već forsira da JSON postane univerzalni jedini kominukacioni jeziki aplikacije!
config.Formatters.Remove(config.Formatters.XmlFormatter);
// C# koristi UpperCase nazive Veličina (Sifra) dok Javascript JS (sifra).
// Ovaj Formatter konvertuje Imena objekata prilagođene Klijentima koji troše podatke (javascriptovima) : camelCase!
var jsonFmt = config.Formatters.JsonFormatter;
jsonFmt.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
ApiController osigurava dostupavanje API Response formata (Ok(),
NotFound()..) i HTTP Orijentiri (GET/POST)