Übung: Implementieren von CRUD-Vorgängen

Die erstellte Benutzeroberfläche des Onlinehändlers sollte alle Produkte im Bestand anzeigen. Damit eine solche Anforderung erfüllt werden kann, ist eine Aktion erforderlich, die auf ein HTTP-GET-Aktionsverb reagiert.

In der folgenden Tabelle wird die Beziehung zwischen HTTP-Aktionsverben, CRUD-Vorgängen und ASP.NET Core-Attributen veranschaulicht. Beispielsweise wird das Aktionsverb HTTP-PUT meistens dazu verwendet, einen Update-Vorgang zu unterstützen. Solche Aktionen werden mit dem Attribut [HttpPut] versehen.

HTTP-Aktionsverb CRUD-Vorgang ASP.NET Core-Attribut
POST Erstellen [HttpPost]
GET Lesen [HttpGet]
PUT Aktualisieren [HttpPut]
DELETE Löschen [HttpDelete]

Neben den in der obigen Tabelle genannten Aktionsverben unterstützt eine Web-API in ASP.NET Core auch HEAD, OPTIONS und PATCH.

In den nachfolgenden Abschnitten wird veranschaulicht, wie Sie jeder dieser vier Aktionen in der Web-API unterstützen.

Abrufen eines Produkts

Ersetzen Sie in Controllers/ProductsController.cs den Kommentar // GET by ID action durch den folgenden Code:

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

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

    return product;
}

Die vorherige Aktion:

  • Reagiert gemäß des Attributs [HttpGet] ausschließlich auf das Aktionsverb HTTP-GET.
  • Erfordert, dass der Wert id im URL-Segment nach products/ eingefügt wird. Beachten Sie, dass das /products-Muster vom Attribut [Route] auf Controllerebene definiert wurde.
  • Fragt die Datenbank für ein Produkt ab, das mit dem angegebenen id-Parameter übereinstimmt.

Jede Verwendung von ActionResult in der obigen Aktion wird in der folgenden Tabelle dem entsprechenden HTTP-Statuscode zugeordnet.

ASP.NET Core
Aktionsergebnis
HTTP-Statuscode BESCHREIBUNG
impliziert Ok 200 Ein Produkt, das mit dem angegebenen id-Parameter übereinstimmt, ist in der Datenbank enthalten.
Das Produkt ist wie im HTTP-Anforderungsheader Accept (standardmäßig JSON) definiert im Medientyp des Antworttexts enthalten.
NotFound 404 Ein Produkt, das mit dem angegebenen id-Parameter übereinstimmt, ist nicht in der Datenbank enthalten.

Hinzufügen eines Produkts

Ersetzen Sie in Controllers/ProductsController.cs den Kommentar // POST action durch den folgenden Code:

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

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

Die vorherige Aktion:

  • Reagiert gemäß des Attributs [HttpPost] ausschließlich auf das Aktionsverb HTTP-POST.
  • Fügt das Product-Objekt des Anforderungstexts in die Datenbank ein.

Hinweis

Da der Controller mit dem [ApiController]-Attribut versehen ist, wird impliziert, dass der Parameter product im Anforderungstext enthalten ist.

Der erste Parameter im Methodenaufruf CreatedAtAction stellt einen Aktionsnamen dar. Das Schlüsselwort nameof wird verwendet, um die Hartcodierung des Aktionsnamens zu vermeiden. CreatedAtAction verwendet den Aktionsnamen, um einen Location-HTTP-Antwortheader mit einer URL für das neu erstellte Produkt zu generieren.

Jede Verwendung von ActionResult in der obigen Aktion wird in der folgenden Tabelle dem entsprechenden HTTP-Statuscode zugeordnet.

ASP.NET Core
Aktionsergebnis
HTTP-Statuscode BESCHREIBUNG
CreatedAtAction 201 Das Produkt wurde der Datenbank hinzugefügt.
Das Produkt ist wie im HTTP-Anforderungsheader Accept (standardmäßig JSON) definiert im Medientyp des Antworttexts enthalten.
impliziert BadRequest 400 Das Product-Objekt des Anforderungstexts ist ungültig.

Ändern eines Produkts

Ersetzen Sie in Controllers/ProductsController.cs den Kommentar // PUT action durch den folgenden Code:

[HttpPut("{id}")]
public async Task<IActionResult> Update(long id, Product product)
{
    if (id != product.Id)
    {
        return BadRequest();
    }

    _context.Entry(product).State = EntityState.Modified;
    await _context.SaveChangesAsync();

    return NoContent();
}

Die vorherige Aktion:

  • Reagiert gemäß des Attributs [HttpPut] ausschließlich auf das Aktionsverb HTTP-PUT.

  • Gibt IActionResult zurück, weil der ActionResult-Rückgabetyp erst zur Laufzeit bekannt ist. Die Methoden BadRequest und NoContent geben den Typ BadRequestResult bzw. NoContentResult zurück.

  • Erfordert, dass der id-Wert im URL-Segment nach products/ eingefügt wird.

  • Aktualisiert die Eigenschaften Name und Price des Produkts. Der folgende Code weist EF Core an, alle Eigenschaften der Product Entität als geändert zu markieren:

    _context.Entry(product).State = EntityState.Modified;
    

    Es ist eine wartungsfreundlichere Alternative zu individuellen Eigenschaftenzuweisungen, die den folgenden hypothetischen Code ersetzt:

    product.Name = productIn.Name;
    product.Price = productIn.Price;
    

Hinweis

Da der Controller mit dem [ApiController]-Attribut versehen ist, wird impliziert, dass der Parameter product im Anforderungstext enthalten ist.

Jede Verwendung von ActionResult in der obigen Aktion wird in der folgenden Tabelle dem entsprechenden HTTP-Statuscode zugeordnet.

ASP.NET Core
Aktionsergebnis
HTTP-Statuscode Beschreibung
NoContent 204 Das Produkt wurde in der Datenbank aktualisiert.
BadRequest 400 Der Id-Wert des Anforderungstexts entspricht nicht dem id-Wert der Route.
impliziert BadRequest 400 Das Product-Objekt des Anforderungstexts ist ungültig.

Entfernen eines Produkts

Ersetzen Sie in Controllers/ProductsController.cs den Kommentar // DELETE action durch den folgenden Code:

[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
    var product = await _context.Products.FindAsync(id);

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

    _context.Products.Remove(product);
    await _context.SaveChangesAsync();

    return NoContent();
}

Die vorherige Aktion:

  • Reagiert gemäß dem Attribut [HttpDelete] ausschließlich auf das Aktionsverb HTTP-DELETE.
  • Erfordert, dass id im URL-Pfad enthalten ist.
  • Fragt die Datenbank für ein Produkt ab, das mit dem angegebenen id-Parameter übereinstimmt.

Jede Verwendung von ActionResult in der obigen Aktion wird in der folgenden Tabelle dem entsprechenden HTTP-Statuscode zugeordnet.

ASP.NET Core
Aktionsergebnis
HTTP-Statuscode Beschreibung
NoContent 204 Das Produkt wurde aus der Datenbank gelöscht.
NotFound 404 Ein Produkt, das mit dem angegebenen id-Parameter übereinstimmt, ist nicht in der Datenbank enthalten.

Erstellen und ausführen

  1. Führen Sie den folgenden Befehl aus, um die App zu erstellen:

    dotnet build --no-restore
    

    Die --no-restore-Option ist enthalten, weil seit dem letzten Build keine NuGet-Pakete hinzugefügt wurden. Der Buildprozess überspringt die Wiederherstellung der NuGet-Pakete und wird ohne Warnungen erfolgreich abgeschlossen. Wenn beim Buildvorgang ein Fehler auftritt, suchen Sie in der Ausgabe nach Informationen zur Problembehandlung.

  2. Starten Sie die Web-API, indem Sie den folgenden Befehl ausführen:

    dotnet ./bin/Debug/netcoreapp3.1/ContosoPets.Api.dll \
        > ContosoPets.Api.log &
    

    Die Web-API wird ausgeführt und kann mit curl getestet werden.

    Wichtig

    Vergessen Sie nicht, die Datei ContosoPets.Api.log falls erforderlich auf Informationen zur Problembehandlung zu überprüfen.