Tartalomjegyzék

< Web API

Dotnet Core - Gyors REST API

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

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:

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:

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; }
}

Linkek