Tartalomjegyzék
Dotnet Core - Gyors REST API
- Szerző: Sallai András
- Copyright © 2024, Sallai András
- 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:
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
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
- Employee.cs
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.
- Controllers/EmployeeController.cs
using Microsoft.AspNetCore.Mvc; namespace app01.Controllers; [ApiController] [Route("api/[controller]")] public class EmployeeController : ControllerBase { public EmployeeController() { } [HttpGet(Name = "GetEmployees")] public IEnumerable<Employee> 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
- DataService.cs
using Microsoft.EntityFrameworkCore; namespace app01.Data; public class DataService : DbContext { public DataService(DbContextOptions<DataService> options) :base(options) {} public DbSet<Employee> Employees {get; set;} = null!; }
A belépési pont
Adatbázis elérés beállítása:
- appsettings.Development.json
{ "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<DataService>(options => { var connectionString = builder.Configuration.GetConnectionString("Mariadb"); options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)); });
Teljes kód
- Program.cs
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<DataService>(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
- Controllers/EmployeeController.cs
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<Employee> 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; } }