KREIRANJE SQL WEB API SERVISA KOJI ČITA PODATKE IZ BAZE
U današnjem digitalnom okruženju, web API servisi postaju ključni za razvoj fleksibilnih i skalabilnih aplikacija. Kroz ovu stranicu, vodićemo vas kroz proces kreiranja SQL Web API servisa koji čita podatke iz baze koristeći ASP.NET Core. Ova aplikacija će vam omogućiti da razumete kako se podaci iz baze pretvaraju u JSON format koji može biti korišćen od strane klijentskih aplikacija.
Zašto Koristiti Ove Alate i Pakete?Da bi se izgradila efikasna i funkcionalna web API aplikacija, potrebno je koristiti određene alate i pakete. Svaki od njih ima specifičnu ulogu u procesu razvoja i omogućava vam da:
Zašto Koristiti Ove Alate i Pakete?Da bi se izgradila efikasna i funkcionalna web API aplikacija, potrebno je koristiti određene alate i pakete. Svaki od njih ima specifičnu ulogu u procesu razvoja i omogućava vam da:
- Efikasno Komunicirate sa Bazom Podataka: Paket Microsoft.Data.SqlClient omogućava uspostavljanje konekcije između vaše aplikacije i SQL Server baze podataka, dok Dapper omogućava brzu i jednostavnu transformaciju rezultata SQL upita u C# objekte.
- Ubrzate Rad sa Podacima: Dapper je poznat po svojoj brzini u mapiranju rezultata upita na C# objekte, čime se smanjuje kompleksnost i povećava efikasnost aplikacije u poređenju sa težim ORM rešenjima.
- Razvijate i Testirate Aplikaciju: VS Code ili Visual Studio su snažni alati za razvoj i testiranje aplikacija, pružajući vam sve što vam je potrebno za pisanje, debagovanje i upravljanje kodom.
- Preporučena dotnet Verzija: Osigurava da koristite najnovije funkcionalnosti i poboljšanja u .NET okruženju.
- Visual Studio Code ili Microsoft Visual Studio: Alati za razvoj koji olakšavaju pisanje i upravljanje kodom. U ovom primeru ćemo koristiti VS Code.
- SQL Server: Baza podataka u kojoj će se čuvati vaši podaci. Ovaj vodič koristi SQL Server kao primer.
- Microsoft SQL Server Management Studio: Alat za upravljanje i rad sa SQL Server bazama podataka.
- Microsoft.Data.SqlClient: Paket za uspostavljanje konekcije sa SQL Server bazom i kreiranje upita.
- Dapper: Biblioteka koja omogućava mapiranje podataka iz baze na C# objekte, pružajući efikasnost i brzinu u radu sa podacima.
Pre nego što se pristupi kreiranju web api servisa potrebno je proveriti da li je instalirano sledeće:
- Preporučena dotnet verzija.
- VS Code ili MS Visual Studio. U ovom primeru je korišćen VS Code
- Baza podataka. U ovom primeru je korišćena SQL Server baza
- Microsoft SQL Server Management Studio
- Microsoft.Data.SQLClient. To je paket koji dopušta da se uspostavi konekcija sa bazom i da se kreiraju upiti
- Dapper. Ovaj paket dopušta da se podaci uvezu iz baze i pretvore u odgovarajuče C# objekte
Pored web aplikacije koji kreiramo potrebno da imamo jednu bazu podataka, na primjer sql server bazu podataka u kojoj se nalaze neki podaci, npr. tabela za proizvode. Cilj web API aplikacije je da odgovori na zahtev klijenta za određenim proizvodom.
Kada se uputi GET zahtev, za određenim proizvodom na primer sa id = 15:
Kada se uputi GET zahtev, za određenim proizvodom na primer sa id = 15:
https://localhost:5001/products/15
aplikacija će pokušati da iz baze izvuče odgovarajući proizvod i vrati nazad aplikaciji( slika 2). Pomoću dodatnog paketa "Dapper", koji smo instalirali sa aplikacijom , odgovarajući red tabele će se pretvoriti u odgovarajući C# objekat koji ima istu strukturu kao tabela u bazi. Primer klase Product možete videti na slici 3.
Dalje, web api konvertuje podatke u JSON objekat a zatim se objekat vraća pregledaču(vidi sliku 4 ).
Dalje, web api konvertuje podatke u JSON objekat a zatim se objekat vraća pregledaču(vidi sliku 4 ).
Aplikacija treba da ima model klasu čija polja odgovaraju poljima koja se nalaze u bazi podataka da bi taj zapis mogao da se pretvori u c# objekat da bi aplikacija mogla da kreiraobjekat koji će da se poveže sa bazom podataka u kodu mora da se napravi klijent za bazu, a zato je potreban dodatni paket "Microsoft.Data.SqlClient".
Video 1: Jednostavan web API server koji čita podatke iz baze - 1. deo |
Video 2: Jednostavan web API server koji čita podatke iz baze - 2. deo |
Detaljnije objašnjenje arhitekture Web API-ja:
- Kontroleri: U Web API arhitekturi, kontroleri su odgovorni za upravljanje HTTP zahtevima i vraćanje odgovora. Svaki kontroler definiše skup akcija koje odgovaraju na specifične rute (URL-ove).
- Modeli: Modeli predstavljaju strukturu podataka i definišu objekte koji se koriste za razmenu informacija između različitih slojeva (npr. iz baze podataka).
- Servisni sloj: Ovaj sloj sadrži poslovnu logiku aplikacije, kao i interakciju sa bazom podataka. Kontroleri se pozivaju na servisni sloj da bi izvršili određene operacije nad podacima.
Sigurnosne preporuke:
- Autentifikacija: Implementiraj sigurne metode autentifikacije poput JWT (JSON Web Token) ili OAuth2 za verifikaciju korisnika.
- Autorizacija: Kontroliši pristup resursima koristeći Role-based ili Policy-based autorizaciju kako bi osigurao da samo ovlašćeni korisnici mogu pristupiti osetljivim podacima.
- Zaštita podataka: Koristi SSL/TLS enkripciju za siguran prenos podataka i zaštitu od napada poput SQL injekcija ili Cross-Site Scripting (XSS).
- Keširanje: Implementiraj keširanje odgovora na nivou servera ili klijenta kako bi smanjio učestalost zahteva prema bazi.
- Optimizacija upita: Koristi indekse i optimizovane SQL upite kako bi smanjio vreme obrade i poboljšao performanse aplikacije pri radu sa velikim količinama podataka.
Kreiranje restful web api servera
Da bi se kreirala nova web api aplikacija u Command Prompt-u u okviru prethodno kreiranog root foldera treba otkucati
Ako u command prompt-u otkucamo
code .
Pokrenuće se VS Code i otvoriti u njemu upravo kreirani projekat.
Sada se sa leve strane u exploreru mogu videti kreirani početni fajlovi upravo kreirane aplikacije. U desnom delu se vidi sadržaj početnog fajla Program.cs u kome se konfiguriše host objekat aplikacije. S obzirom da je potrebna baza za proizvode treba kreirati bazu, u ovom slučaju SQL Server bazu, koja će se zvati u ovom primeru "database_product". Baza i u njoj tabela "Products" je kreirana pomoću alata Microsoft SQL Server Management Studio. Dizajn kreirane tabele može se videti na slici ispod:
Da bi aplikacija konektovala na bazu potrebno je da budu instalirani gore pomenuti paketi:
Kreiraćemo ConnectionString unutar appsetings.json fajla
- Microsoft.Data.SQLClient
- Dapper
Kreiraćemo ConnectionString unutar appsetings.json fajla
Pogledajte u sledećem videu kako se koristi Dapper biblioteka za čitanje podataka iz baze i njihovo konverovanje u C# objekte. U videu je pokazana upotreba odgovarajućih querry-ja za tu namenu.
Koristan tutorijal o upotrebi Dapper-a: dapper-tutorial.net/
Ukoliko želite da isprobavate Dapper upite: dotnetfiddle.net/
Koristan tutorijal o upotrebi Dapper-a: dapper-tutorial.net/
Ukoliko želite da isprobavate Dapper upite: dotnetfiddle.net/
Dapper biblioteka
Dapper je lagana biblioteka za pristup podacima u .NET aplikacijama koja omogućava efikasno i jednostavno mapiranje podataka iz baze podataka na C# objekte. Razvijena je da pruži brzinu i jednostavnost u odnosu na druge ORM (Object-Relational Mapping) biblioteke poput Entity Framework-a, dok zadržava fleksibilnost i kontrolu.
Evo nekoliko ključnih tačaka o Dapper biblioteci:
Evo nekoliko ključnih tačaka o Dapper biblioteci:
- Jednostavnost i Brzina: Dapper je poznat po svojoj brzini, jer je dizajniran da bude minimalan i da izbegne složene procese koje neki ORM-ovi koriste. Ova brzina dolazi iz njegove sposobnosti da direktno mapira rezultate upita na objekte bez puno dodatnog overhead-a.
- Mapiranje Rezultata: Dapper omogućava mapiranje rezultata SQL upita na C# objekte koristeći jednostavne metode kao što su Query<T> i QuerySingle<T>. Ovo pojednostavljuje rad sa podacima i smanjuje potrebu za pisanjem puno koda za transformaciju podataka.
- Kompatibilnost sa SQL Serverom i Drugi DBMS: Iako je najčešće korišćen sa SQL Server-om, Dapper je kompatibilan sa različitim bazama podataka, kao što su MySQL, PostgreSQL, SQLite i drugi, koristeći odgovarajuće ADO.NET provajdere.
- Nepristrasnost: Dapper ne pruža funkcionalnosti kao što su automatsko kreiranje migracija ili složeni upiti. Umesto toga, pruža alat za direktno pisanje SQL upita i komandama, što omogućava potpunu kontrolu nad SQL-om koji se izvršava.
- Ekstenzija za Postojeće ADO.NET: Dapper se koristi kao ekstenzija za postojeće ADO.NET objekte, kao što su IDbConnection. Ovo omogućava korišćenje Dapper-a u već postojećim projektima bez potrebe za značajnim prepravkama.
U okviru startup fajla unutar metode configuration kreiraćemo objekat pomoću koga se uspostavlja veza sa bazom podataka. Za kreiranje tog objekta klase SqlConnection koristimo informacije zapisane u konekcionom stringu koji je definisan u appsettings.json fajlu, kao što se može videti na sledećoj slici:
.
Unutar ove metode vrši ubacivanje zavisnosti (DependencyInjection) između klasa u aplikaciji i njima potrebnih servisa i objeka. Unutar ove metode se kreiraju servisi koji se dodaju u kolekciju servisa(IServiceCollection), koji će biti dostupni u klasama unutar aplikacije preko parametara u konstruktoru. Ovaj koncept se zove IoC Inverzija kontrole i više o tome pogledajte u videu: IoC Inverzija kontrole u .Net aplikacijama.
Takođe, treba dodati kontrolere u ovu kolekciju.
Unutar ove metode vrši ubacivanje zavisnosti (DependencyInjection) između klasa u aplikaciji i njima potrebnih servisa i objeka. Unutar ove metode se kreiraju servisi koji se dodaju u kolekciju servisa(IServiceCollection), koji će biti dostupni u klasama unutar aplikacije preko parametara u konstruktoru. Ovaj koncept se zove IoC Inverzija kontrole i više o tome pogledajte u videu: IoC Inverzija kontrole u .Net aplikacijama.
Takođe, treba dodati kontrolere u ovu kolekciju.
Uputstva za Konfiguraciju
Kada radimo sa statičkim stranicama u ASP.NET Core aplikaciji, važno je pravilno konfigurirati server da bi mogao da ih servira. Ovo se postiže dodavanjem specifičnih linija koda u Startup.cs datoteku, koja je ključna za konfiguraciju i inicijalizaciju aplikacije.
public class Startup
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Koristi zadate fajlove kao što su index.html ako nije specificiran drugi fajl
app.UseDefaultFiles();
// Omogućava serviranje statičkih fajlova iz wwwroot direktorijuma
app.UseStaticFiles();
// Ostali middleware i konfiguracije
}
}
{
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Koristi zadate fajlove kao što su index.html ako nije specificiran drugi fajl
app.UseDefaultFiles();
// Omogućava serviranje statičkih fajlova iz wwwroot direktorijuma
app.UseStaticFiles();
// Ostali middleware i konfiguracije
}
}
Šta ove linije koda rade:
Konfiguracija wwwroot direktorijuma:
- app.UseDefaultFiles();
- Šta radi: Ova linija omogućava serveru da automatski koristi zadate fajlove kada korisnik ne specificira određeni fajl u URL-u. Na primer, ako korisnik poseti http://localhost:5000/, server će automatski vratiti index.html iz wwwroot foldera ako postoji.
- Zašto je važna: Ovo je korisno za pružanje osnovne stranice kao što je index.html kada korisnik poseti koreni URL vaše aplikacije, bez potrebe da eksplicitno navede ime fajla.
- app.UseStaticFiles();
- Šta radi: Ova linija omogućava serveru da servira statičke fajlove kao što su HTML, CSS, JavaScript, slike itd., iz wwwroot foldera. Kada korisnik zatraži URL koji odgovara nekom fajlu u wwwroot (kao što je http://localhost:5000/Students.html), server će pronaći taj fajl i poslati ga klijentu.
- Zašto je važna: Ova komanda omogućava vašoj aplikaciji da efikasno posluži statičke resurse koje su potrebne za prikazivanje web stranica, čime se omogućava korisnicima da vide sadržaj vaše web stranice.
Konfiguracija wwwroot direktorijuma:
- wwwroot je podrazumevani direktorijum za statičke fajlove u ASP.NET Core aplikaciji. Kada dodate ovu konfiguraciju, ASP.NET Core automatski traži statičke fajlove u ovom direktorijumu.
- Kako dodati fajlove: Da biste dodali statičke stranice kao što su Contact.html ili Index.html, jednostavno ih stavite u wwwroot direktorijum. URL-ovi kao što su http://localhost:5000/Contact.html će sada vraćati odgovarajući sadržaj iz tog fajla.
Unutar metode Configure treba definisati potrebne "Middleware" i njihov redosled kojim treba da se izvrše. Više o tome pročitajte u članku: Middleware
Ova aplikacija će imati klase koje pripadaju modelu, kao i jednu kontroler klasu. Kao model kreiraćemo klasu Product koja će biti model klasa za objekte koji predstavljaju podatke o određenom proizvodu i imaće istu strukturu kao jedan zapis u bazi podataka, dakle imaće ista polja. Na slici 12 je prikazana klasa Product
Inverzija kontrole(IoC) u .net aplikacijama
Inverzija kontrole (IoC) je princip dizajna u softverskom razvoju koji omogućava veću fleksibilnost i testabilnost aplikacija smanjenjem zavisnosti između komponenti. U kontekstu .NET aplikacija, IoC se obično koristi uz DI (Dependency Injection), što je jedan od najpopularnijih načina za implementaciju IoC principa.
Ključni Koncepti IoC
Ključni Koncepti IoC
- Inverzija Kontrole (IoC): Ovaj princip se odnosi na prebacivanje kontrole nad kreiranjem objekata i upravljanjem njihovim životnim ciklusom sa aplikacijskog koda na neki spoljašnji sistem, najčešće IoC kontejner. Umesto da komponenta direktno kreira i upravlja zavisnostima, IoC kontejner to radi.
- Dependency Injection (DI): Ovo je tehnika za implementaciju IoC-a gde zavisnosti (npr. servisi ili objekti koje klasa koristi) se "ubacuju" u klasu sa spoljašnjeg izvora, umesto da ih klasa kreira sama. Ovo može da se uradi na nekoliko načina:
- Konstruktor DI: Zavisnosti se prenose kroz konstruktor klase.
- Proprijet DI: Zavisnosti se postavljaju preko javnih svojstava (proprijeta).
- Metoda DI: Zavisnosti se prosleđuju kroz metodu.
- Smanjena Zavistanost: Komponente su manje zavisne jedna od druge, što čini kod fleksibilnijim i lakšim za promene.
- Povećana Testabilnost: Sa zavisnostima ubačenim iz spolja, lako je koristiti mock objekte ili stubove u testiranju.
- Bolja Organizacija Koda: Korišćenje IoC kontejnera pomaže u organizaciji i upravljanju zavisnostima, čime se smanjuje složenost kod baze.
- Promena Implementacija: Mogućnost lako menjanja implementacija zavisnosti bez promene koda koji ih koristi.
- Microsoft.Extensions.DependencyInjection: Ovo je osnovni IoC kontejner koji dolazi sa .NET Core i .NET 5/6+. Pruža osnovne funkcionalnosti DI i lako se integriše u .NET aplikacije.
- Autofac: Napredniji IoC kontejner sa dodatnim mogućnostima i konfiguracijom.
- Ninject: Još jedan popularan IoC kontejner poznat po svojoj fleksibilnosti i jednostavnosti korišćenja.
- Unity: Microsoft-ov IoC kontejner koji je deo Enterprise Library.
Kako se koristi u .NET aplikacijamaKada koristite IoC u .NET aplikacijama, obično ćete registrovati svoje servise u IoC kontejneru tokom inicijalizacije aplikacije, a zatim će IoC kontejner automatski obezbediti potrebne zavisnosti za vaše klase. Na primer, u ASP.NET Core aplikacijama, registracija servisa se obavlja u Startup.cs datoteci:
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IMyService, MyService>();
// Dodajte druge servise
}
{
services.AddTransient<IMyService, MyService>();
// Dodajte druge servise
}
A zatim, kada koristite IMyService u vašim kontrolerima ili drugim klasama, .NET će automatski obezbediti instancu MyService:
public class MyController : Controller
{
private readonly IMyService _myService;
public MyController(IMyService myService)
{
_myService = myService;
}
}
{
private readonly IMyService _myService;
public MyController(IMyService myService)
{
_myService = myService;
}
}
Ukratko, IoC i DI su ključni za moderne .NET aplikacije jer pomažu u održavanju čistog, fleksibilnog i testabilnog koda.
Optimizacija performansi:
- Optimizacija upita: Potrebno je koristiti indekse za ubrzanje pristupa podacima i smanjenje vremena obrade složenih SQL upita. Takođe je potrebno analizirati upite koristeći SQL Server alatke poput Query Execution Plan kako bi se identifikovali i poboljšali sporiji upiti.
- Keširanje: Potrebno je implementirati keširanje podataka na nivou aplikacije ili baze. Koristite Redis ili Memcached za skladištenje često korišćenih podataka, čime će se smanjiti učestalost pristupa bazi i ubrzati aplikacija.
Sigurnosne preporuke
Sigurnost je ključna za svakog web API servisa kako bi se zaštitili podaci i sprečili neautorizovani pristupi. Evo nekoliko ključnih sigurnosnih preporuka i kako ih implementirati u ASP.NET Core aplikaciji:
1. AutentifikacijaAutentifikacija je proces identifikacije korisnika koji pristupa vašem API-ju. Preporučuje se korišćenje JSON Web Tokens (JWT) za sigurnu autentifikaciju.
Kako Implementirati JWT:
1. AutentifikacijaAutentifikacija je proces identifikacije korisnika koji pristupa vašem API-ju. Preporučuje se korišćenje JSON Web Tokens (JWT) za sigurnu autentifikaciju.
Kako Implementirati JWT:
- Dodavanje NuGet Paketa: Dodajte Microsoft.AspNetCore.Authentication.JwtBearer paket u vaš projekat:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
2. Konfigurišite JWT u Startup.cs: U ConfigureServices metodi dodajte konfiguraciju za JWT:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourissuer",
ValidAudience = "youraudience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
services.AddControllers();
}
{
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "yourissuer",
ValidAudience = "youraudience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key"))
};
});
services.AddControllers();
}
3. Dodajte Autentifikaciju u Configure Metodu:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Autorizacija kontroliše pristup resursima baziran na korisničkim ulogama ili politikama.
Kako Implementirati Autorizaciju:
Kako Implementirati Autorizaciju:
- Definišite Politike: U Startup.cs, u ConfigureServices metodi, dodajte:
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
{
options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});
Koristite Politike u Kontrolerima:
[Authorize(Policy = "AdminOnly")]
[ApiController]
[Route("[controller]")]
public class AdminController : ControllerBase
{
// Actions
}
[ApiController]
[Route("[controller]")]
public class AdminController : ControllerBase
{
// Actions
}
3. Zaštita PodatakaZa zaštitu podataka, koristite SSL/TLS enkripciju za siguran prenos podataka i zaštitu od napada kao što su SQL injekcije ili Cross-Site Scripting (XSS).
Kako Konfigurišete SSL/TLS:
Kako Konfigurišete SSL/TLS:
- Obavezivanje SSL/TLS u appsettings.json:
"Kestrel": {
"Endpoints": {
"Https": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "path_to_your_certificate.pfx",
"KeyPassword": "your_certificate_password"
}
}
}
}
"Endpoints": {
"Https": {
"Url": "https://localhost:5001",
"Certificate": {
"Path": "path_to_your_certificate.pfx",
"KeyPassword": "your_certificate_password"
}
}
}
}
Obavezivanje HTTPS u Startup.cs:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
// other middleware
}
{
app.UseHttpsRedirection();
// other middleware
}
Dodatni Resursi
Za dalje učenje i istraživanje, ovde su neki korisni resursi i dokumentacija:
- ASP.NET Core Dokumentacija
- JWT Autentifikacija
- SSL/TLS Konfiguracija
- Dapper Dokumentacija
- Optimizacija Performansi
Sledeće
Kreiranje kontrolera u asp.net web API aplikaciji >| |