← l-artikli kollha

.NET

X'Tgħallimt dwar il-Bini ta' REST APIs f'.NET

API CRUD sempliċi, ebda pagamenti, xejn fanċi. Il-verbi HTTP, ir-routing, EF Core, u l-istatus codes finalment qed jaqbdu waqt li nibniha.

X'Tgħallimt dwar il-Bini ta' REST APIs f'.NET

Għadni kif temmejt l-ewwel REST API vera tiegħi f'.NET: app CRUD sempliċi, ebda pagamenti, xejn fanċi. Hija bażika, iżda li nibniha hija fejn ħafna mill-fundamentali finalment qed jaqbdu għalija.

Nagħti l-verbi HTTP mad-dak li suppost jagħmlu

Kont naf li GET, POST, PUT, u DELETE jeżistu qabel ma bdejt din, iżda ma fhimtx verament għaliex kien jimporta liema wieħed tuża sakemm bnejt xi ħaġa bl-erbgħa. GET jaqra, POST joħloq, PUT jaġġorna, DELETE ineħħi, u kull wieħed jimmappja b'mod nadif fuq azzjoni ta' Controller. Nara flimkien ħdejn xulxin, tieqaf tkun regola astratta u tibda tkun ovvja.

Ir-Routing u l-Controllers

Qed nuża Controllers għax dak hu li kull tutorial li segwejt juża. [ApiController], [Route("api/products")], u azzjoni għal kull verb HTTP:

[ApiController]
[Route("api/products")]
public class ProductsController : ControllerBase
{
    private readonly AppDbContext _context;

    public ProductsController(AppDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _context.Products.ToListAsync();
        return Ok(products);
    }
}

Ħassitha bħal ħafna attributi biex timmemorizza fil-bidu, iżda ladarba fhimt li r-route u l-verb flimkien jiddeċiedu liema azzjoni taħdem, waqfet tħossha arbitrarja.

Nitkellem mad-database b'EF Core

Din hija l-ewwel darba li użajt Entity Framework Core għal xi ħaġa vera minflok eżempju tal-ġugarelli ta' tutorial. Mudell, DbContext, u connection string:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
}

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

    public DbSet<Product> Products => Set<Product>();
}

Imbagħad inħaddem il-migration biex verament noħloq it-tabella:

dotnet ef migrations add InitialCreate
dotnet ef database update

Dik kienet l-ewwel darba li l-API ħassitha qed tagħmel xi ħaġa minflok sempliċiment tirritorna dejta falza.

L-istatus codes verament ifissru xi ħaġa

Qabel din kont nirritorna 200 għal bażikament kollox. Li nibni din l-API hija l-ewwel darba li qed nagħti kas ta' liema wieħed verament qed nibgħat lura:

[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
    var product = await _context.Products.FindAsync(id);

    if (product is null)
    {
        return NotFound();
    }

    return Ok(product);
}

[HttpPost]
public async Task<IActionResult> Create(Product product)
{
    _context.Products.Add(product);
    await _context.SaveChangesAsync();

    return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
}

NotFound() jagħti 404, Ok() 200, u CreatedAtAction jirritorna 201 flimkien mal-URL tal-ħaġa li għadha kif inħolqot. Li tagħmilhom sew jagħmel l-API tagħmel sens lil kwalunkwe ħadd li jsejjaħha mingħajr ma jaqra l-kodiċi.

Fejn dan iħallini

Xejn dwar dan il-proġett mhu avvanzat. Hija API CRUD sempliċi b'database warajha, u l-biċċa l-kbira ta' dak li tgħallimt huwa sempliċiment il-bażi taqbad f'postha għall-ewwel darba. Dak hu kollox li din hija bħalissa, u dak biżżejjed għal fejn ninsab.