[[oktatas:programozas:csharp:dotnetcore:web_api|< Web API]] ====== Dotnet Core - Gyors REST API ====== * **Szerző:** Sallai András * Copyright (c) 2024, Sallai András * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Bevezetés ===== Itt nem használjuk a projekt létrehozásánál a -minimal kapcsolót, így létrejön a WeatherForecast végpont, de ebből készítünk másolatot, és ezt írjuk át. Az itt létrehozott REST API megtalálható itt: * https://github.com/oktat/emp_dotnet_crud A leírás nem tartalmaz azonosítás beállítást. ===== Projekt létrehozása ===== dotnet new webapi --name app01 ===== Függőségek ===== Keressük meg az utolsó verziót az adott keretrendszerhez. Ha például 7-s keretrendszer van telepítve, akkor 7.x verziót: * https://www.nuget.org/packages/Microsoft.EntityFrameworkCore Ha kattintunk a verzióra, akkor kiírja hogyan kell telepíteni. dotnet add package Microsoft.EntityFrameworkCore --version 7.0.15 dotnet add package Pomelo.EntityFrameworkCore.MySql --version 7.0.0 ===== Model ===== namespace app01; public class Employee { public int Id { get; set; } public string? Name { get; set; } public string? City { get; set; } public double Salary { get; set; } } ===== Kontroller elsőre ===== Lemásoljuk a meglévő kontrollert, átírjuk az osztály és konstruktor nevet, töröljük a felesleget. A visszatérés egy Nagy István nevű dolgozó lesz mindig. using Microsoft.AspNetCore.Mvc; namespace app01.Controllers; [ApiController] [Route("api/[controller]")] public class EmployeeController : ControllerBase { public EmployeeController() { } [HttpGet(Name = "GetEmployees")] public IEnumerable Get() { return Enumerable.Range(1, 5).Select(index => new Employee { Id = 25, Name = "Nagy István", City = "Szeged", Salary = 359 }) .ToArray(); } } A Route attribútum jelenleg így néz ki: [Route("api/[controller]")] Ebben az esetben a végpont neve a Controller előtti rész. Esetünkbe ez most egyes számban van, így a végpont: * api/employee Magunk is megadhatjuk a végpont nevét: [Route("api/employees")] ===== Ellenőrzés ===== Indítsuk el a szervert: dotnet watch run Ellenőrizzük a Swaggerben vagy HTTPie http parancsával: http localhost:5012/employee ===== Adatbázis elérés ===== using Microsoft.EntityFrameworkCore; namespace app01.Data; public class DataService : DbContext { public DataService(DbContextOptions options) :base(options) {} public DbSet Employees {get; set;} = null!; } ===== A belépési pont ===== Adatbázis elérés beállítása: { "ConnectionStrings": { "Mariadb": "server=localhost;user=sargabt;password=titok;database=sargabt" } } A using a forráskód elejére: using Microsoft.EntityFrameworkCore; using app01.Data; Adatbázis elérés a "var app ..." elé: builder.Services.AddDbContext(options => { var connectionString = builder.Configuration.GetConnectionString("Mariadb"); options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); }); ==== Teljes kód ==== using Microsoft.EntityFrameworkCore; using valami.Data; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddDbContext(options => { var connectionString = builder.Configuration.GetConnectionString("Mariadb"); options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run(); ===== A kontroller adatbázishoz igazítása ===== using Microsoft.AspNetCore.Mvc; using app01.Data; namespace app01.Controllers; [ApiController] [Route("[controller]")] public class EmployeeController : ControllerBase { private readonly DataService _db; public EmployeeController(DataService db) { _db = db; } [HttpGet(Name = "GetEmployees")] public IEnumerable Get() { return _db.Employees.ToArray(); } } ===== Ellenőrzés ===== Szükség lehet a szerver újraindítására: dotnet watch run Ellenőrizzük a Swaggerben vagy HTTPie http parancsával: http localhost:5012/employee ===== A Create művelet ===== [HttpPost] public Employee Post(Employee employee) { _db.Employees.Add(employee); _db.SaveChanges(); var res = _db.Employees.Single(e => e.Id == employee.Id); return res; } ==== 201 Create kód ==== Ha szeretnénk a Create műveletnek megfelelően 201-s kódot visszaadni kicsit változtatnunk kell: [HttpPost] public IActionResult Post(Employee employee) { _db.Employees.Add(employee); _db.SaveChanges(); var res = _db.Employees.Single(e => e.Id == employee.Id); return CreatedAtAction(nameof(Get), new { id = res.Id}, res); } ===== Az update művelet ===== [HttpPut("{id}")] public Employee Put(long id, Employee emp) { var act = _db.Employees.Find(id); if(act == null) { return emp; } act.Name = emp.Name; act.City = emp.City; act.Salary = emp.Salary; _db.SaveChanges(); var res = _db.Employees.Single(e => e.Id == id); return res; } ===== A delete művelet ===== [HttpDelete("{id}")] public int Delete(long id) { var act = _db.Employees.Find(id); if(act == null) { return 0; } _db.Employees.Remove(act); var affectedRecords = _db.SaveChanges(); return affectedRecords; } ===== Swagger ===== Vegyük a PUT metódust. A fenti újraírt változatban a Post() metódus siker esetén 201 Create kóddal tér vissza. Igen ám, de Swagger-t használunk és ott nem látszik. Ha erre van szükségünk, vegyünk fel még két attribútumot, ahol megadjuk a visszatérés típusát. Egy ProduceResponseType() függvényt használunk. Ez az attribútum a 7-s DoteNet verzióban jelent meg. [HttpPost] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public IActionResult Post(Employee employee) { _db.Employees.Add(employee); _db.SaveChanges(); var res = _db.Employees.Single(e => e.Id == employee.Id); return CreatedAtAction(nameof(Get), new { id = res.Id}, res); } ===== Visszatérés típusa ===== Visszatéréshez használhatjuk Ok() függvényt. POST metódus esetén viszont 201 visszatérési kódra van szükség. Ilyen esetben szerencsésebb a CreateAtAction() vagy a CreatedAtRoute() metódus hívása, mivel az OK, mindig 200-s kóddal fog visszatérni. ===== Dátum ===== "ConnectionStrings": { "Mariadb": "server=localhost;user=sargabt;password=titok;database=sargabt; AllowZeroDateTime=True;Convert Zero Datetime=True" } public class Employee { public int Id { get; set; } public string? Name { get; set; } public string? City { get; set; } public double Salary { get; set; } public DateOnly Birth { get; set; } } ===== Linkek ===== * https://learn.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-8.0&tabs=visual-studio-code (2024)