[[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)