ASP.NET Core: statičke strane i jednostavni web servisi

Lekcija 2 od 7 · ASP.NET Core

Server iz prve lekcije proširujemo na dva načina: da šalje gotove HTML, CSS i JavaScript fajlove iz foldera wwwroot i da odgovara podacima u formatu JSON. Na kraju ih spajamo – stranica JavaScript-om traži podatke od servera.

Pre nego što počneš: potrebno predznanje – prvi web server, API i JSON.
Kako da učiš: radi u svom projektu korak po korak i posle svake izmene pokreni aplikaciju; zadatak na kraju prvo uradi sam/a. Kod je u C#-u za .NET 8 ili noviji (preporuka: aktuelna LTS verzija); naziv fajla je u komentaru na vrhu svakog primera.

Statičke strane: wwwroot

// Program.cs
using System.Globalization;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseDefaultFiles();     // zahtev za "/" traži index.html
app.UseStaticFiles();      // šalje fajlove iz foldera wwwroot (HTML, CSS, JS, slike)

// JSON servisi (ispod)
var sr = new CultureInfo("sr-Latn-RS");
app.MapGet("/api/vreme", () => new
{
    vreme = DateTime.Now.ToString("HH:mm:ss"),
    dan = DateTime.Now.ToString("dddd", sr)          // "petak"
});
app.MapGet("/api/zdravo/{ime}", (string ime) => new { poruka = $"Zdravo, {ime}!" });
app.MapGet("/api/zbir", (int a, int b) => new { a, b, zbir = a + b });   // /api/zbir?a=2&b=3

app.Run();
PrviServer/
├── Program.cs
└── wwwroot/
    ├── index.html        ← http://localhost:5123/
    ├── kontakt.html      ← http://localhost:5123/kontakt.html
    ├── css/stil.css
    └── slike/logo.png

Napravi folder wwwroot u korenu projekta. Redosled je važan: UseDefaultFiles mora biti pre UseStaticFiles. Ovi pozivi su middleware – delovi kroz koje svaki zahtev prolazi redom, kao kroz traku u fabrici.

Web servisi koji vraćaju JSON

ZahtevOdgovor
GET /api/vreme{"vreme":"14:05:31","dan":"petak"}
GET /api/zdravo/Ana{"poruka":"Zdravo, Ana!"}
GET /api/zbir?a=2&b=3{"a":2,"b":3,"zbir":5}
GET /api/zbir?a=dva400 Bad Request – a nije ceo broj

Kada funkcija vrati objekat, ASP.NET Core ga sam pretvori u JSON (imena polja malim početnim slovom). Parametri se uzimaju iz putanje ({ime}) ili iz upita (?a=2) – tip parametra (int) odmah proverava unos. Ovo je isti JSON iz lekcije Šta je API.

Stranica koja koristi servis

<!-- wwwroot/index.html -->
<!DOCTYPE html>
<html lang="sr">
<head><meta charset="utf-8"><title>Moj server</title></head>
<body>
  <h1>Dobro došli</h1>
  <p>Danas je <span id="dan">…</span>, a tačno vreme je <span id="vreme">…</span>.</p>
  <button id="osvezi">Osveži</button>
  <script>
    async function ucitaj() {
      const odgovor = await fetch("/api/vreme");     // ista adresa servera, pa samo putanja
      const podaci = await odgovor.json();
      document.getElementById("dan").textContent = podaci.dan;
      document.getElementById("vreme").textContent = podaci.vreme;
    }
    document.getElementById("osvezi").addEventListener("click", ucitaj);
    ucitaj();
  </script>
</body>
</html>

Statička strana i servis su u istoj aplikaciji: HTML stiže kao fajl, a podaci kao JSON. Tako rade i veće aplikacije – razlika je samo u broju servisa.

Statičko ili dinamičko

Statički fajlWeb servis (endpoint)
odaklefolder wwwrootfunkcija u Program.cs ili kontroleru
isti za svedane – zavisi od parametara, vremena, baze
primerindex.html, stil.css/api/vreme, /api/proizvodi

Videi iz prve verzije lekcije

Napomena uz video: snimljen je za prvu verziju lekcija (.NET 5/6, klasa Startup, SQL Server i Dapper). Ideje su iste, ali je kod na ovoj strani pisan za današnji .NET (sve u Program.cs) – kada se razlikuju, važi kod sa strane.

Zadaci za vežbu

Za svaki zadatak postoji primer, uputstvo i rešenje.

ZADATAK 01Težina: srednje

Kalkulator sa servisom

Dodaj servis /api/racunaj?a=…&b=…&op=… koji za op = +, -, *, / vraća rezultat, a za deljenje nulom ili nepoznatu operaciju odgovor 400. Napravi i stranu kalkulator.html koja ga koristi.

Česte greške i saveti
  • Fajlovi van foldera wwwroot se ne šalju – to je i zaštita (npr. appsettings.json nije dostupan spolja).
  • UseDefaultFiles ne šalje fajl sam – samo prepravlja adresu; zato mora pre UseStaticFiles.
  • U ASP.NET Core-u se imena JSON polja pišu malim početnim slovom (dan), iako je u C#-u svojstvo Dan.

Proveri znanje

Otvori kviz

Statičke strane i servisi

1. Iz kog foldera ASP.NET Core šalje statičke fajlove?




2. Šta vraća servis koji iz funkcije vrati objekat new { zbir = 5 }?




3. Kakav odgovor dobija /api/zbir?a=dva ako je parametar a tipa int?