Übung: Implementieren von CRUD-Vorgängen

Abgeschlossen

Wir erweitern nun unseren Web-API-Controller, um die Möglichkeit zum Erstellen (POST), Aktualisieren (PUT) und Löschen (DELETE) von Pizzas aus unserem Bestand hinzuzufügen.

Hinzufügen einer Pizza

Lassen Sie uns das Hinzufügen einer Pizza über die Web-API mithilfe einer POST-Methode ermöglichen.

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

[HttpPost]
public IActionResult Create(Pizza pizza)
{            
    PizzaService.Add(pizza);
    return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}

Die vorherige Aktion:

  • Reagiert nur auf das HTTP-Verb POST, wie durch das [HttpPost]-Attribut angegeben.
  • Fügt das Pizza-Objekt des Anforderungstexts in den In-Memory-Cache ein.

Hinweis

Da der Controller mit dem [ApiController]-Attribut versehen ist, wird impliziert, dass der Parameter Pizza 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 zum neu erstellten Pizzadatensatz zu generieren, wie in der vorherigen Einheit erläutert.

Ändern einer Pizza

Lassen Sie uns nun das Aktualisieren einer Pizza über die Web-API mithilfe einer PUT-Methode ermöglichen.

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

[HttpPut("{id}")]
public IActionResult Update(int id, Pizza pizza)
{
    if (id != pizza.Id)
        return BadRequest();
           
    var existingPizza = PizzaService.Get(id);
    if(existingPizza is null)
        return NotFound();
   
    PizzaService.Update(pizza);           
   
    return NoContent();
}

Die vorherige Aktion:

  • Reagiert gemäß des Attributs [HttpPut] ausschließlich auf das Aktionsverb HTTP-PUT.
  • Erfordert, dass der Wert des Parameters id im URL-Segment hinter pizza/ eingefügt wird.
  • Gibt IActionResult zurück, weil der Rückgabetyp ActionResult erst zur Laufzeit bekannt ist. Die Methoden BadRequest, NotFound und NoContent geben die Typen BadRequestResult, NotFoundResult und NoContentResult zurück.

Hinweis

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

Entfernen einer Pizza

Lassen Sie uns schließlich das Entfernen einer Pizza über die Web-API mithilfe einer DELETE-Methode ermöglichen.

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

[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    var pizza = PizzaService.Get(id);
   
    if (pizza is null)
        return NotFound();
       
    PizzaService.Delete(id);
   
    return NoContent();
}

Die vorherige Aktion:

  • Reagiert nur auf das HTTP-Verb DELETE, wie durch das [HttpDelete]-Attribut angegeben.
  • Erfordert, dass der Wert des Parameters id im URL-Segment hinter pizza/ eingefügt wird.
  • Gibt IActionResult zurück, weil der ActionResult-Rückgabetyp erst zur Laufzeit bekannt ist. Die Methoden NotFound und NoContent geben den Typ NotFoundResult bzw. NoContentResult zurück.
  • Fragt den In-Memory-Cache nach einer Pizza ab, die mit dem angegebenen id-Parameter übereinstimmt.

Denken Sie daran, die Datei Controllers/PizzaController.cs zu speichern, ehe Sie fortfahren.

Erstellen und Ausführen der fertiggestellten Web-API

Erstellen und starten Sie die Web-API, indem Sie den folgenden Befehl ausführen:

dotnet run

Testen der fertigen Web-API mit HTTP-Dateien

  1. Öffnen Sie die Datei ContosoPizza.http erneut.

  2. Geben Sie mit dem folgenden Befehl eine POST-Anforderung zum Hinzufügen einer neuen Pizza in HttpRepl aus:

    POST {{ContosoPizza_HostAddress}}/pizza/
    Content-Type: application/json
    
    {
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
    ###
    

    Der oben genannte Befehl gibt die neu erstellte Pizza zurück:

    HTTP/1.1 201 Created
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 17:03:02 GMT
    Server: Kestrel
    Location: http://localhost:5192/Pizza/3
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
  3. Aktualisieren Sie die neue Pizza Hawaii mit einer PUT-Anforderung mit dem folgenden Befehl in eine Hawaiian-Pizza:

    PUT {{ContosoPizza_HostAddress}}/pizza/3
    Content-Type: application/json
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
    ###
    

    Der vorherige Befehl gibt die folgende Ausgabe zurück, die Erfolg angibt:

    HTTP/1.1 204 No Content
    Connection: close
    Date: Wed, 17 Jan 2024 17:07:30 GMT
    Server: Kestrel
    

    Führen Sie die GET-Aktion mit dem folgenden Befehl erneut aus, um zu überprüfen, ob die Pizza aktualisiert wurde:

    GET {{ContosoPizza_HostAddress}}/pizza/3
    Accept: application/json
    
    ###
    

    Der vorherige Befehl gibt die neu aktualisierte Pizza zurück:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 17:09:01 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
  4. Unsere API kann auch die neu erstellte Pizza mit der DELETE-Aktion löschen, wenn Sie den folgenden Befehl ausführen:

    DELETE {{ContosoPizza_HostAddress}}/pizza/3
    
    ###
    

    Der vorherige Befehl gibt ein Ergebnis 204 No Content für den Erfolg zurück:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:30:04 GMT
    Server: Kestrel
    

    Führen Sie die GET-Aktion mit dem folgenden Befehl erneut aus, um zu überprüfen, ob die Pizza entfernt wurde:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    

    Der vorherige Befehl gibt die ursprünglichen Pizzas als Ergebnisse zurück:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:31:15 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]
    

Sie haben nun die Implementierung und das Testen der mit ASP.NET Core neu erstellten Web-API abgeschlossen.

Optional: Testen der fertig gestellten Web-API mit der Befehlszeile HTTP REPL

  1. Öffnen Sie das vorhandene httprepl-Terminal erneut, oder öffnen Sie ein neues integriertes Terminal aus Visual Studio Code, indem Sie im Hauptmenü Terminal>Neues Terminal auswählen.

  2. Wenn Sie ein neues Terminal geöffnet haben, stellen Sie mit dem folgenden Befehl eine Verbindung mit der Web-API her:

    httprepl https://localhost:{PORT}
    

    Alternativ können Sie den folgenden Befehl jederzeit ausführen, während HttpRepl ausgeführt wird:

    connect https://localhost:{PORT}
    
  3. Navigieren Sie zum Pizza-Endpunkt, indem Sie den folgenden Befehl ausführen:

    cd Pizza
    
  4. Führen Sie den folgenden Befehl aus, um die neuen Aktionen für die Pizza-API zu sehen:

    ls
    

    Der vorherige Befehl zeigt eine Ausgabe der verfügbaren APIs für den Pizza-Endpunkt an:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. Geben Sie mit dem folgenden Befehl eine POST-Anforderung zum Hinzufügen einer neuen Pizza in HttpRepl aus:

    post -c "{"name":"Hawaii", "isGlutenFree":false}"
    

    Der oben genannte Befehl gibt die neu erstellte Pizza zurück:

    HTTP/1.1 201 Created
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:23:09 GMT
    Location: https://localhost:{PORT}/Pizza?id=3
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaii",
        "isGlutenFree": false
    }
    
  6. Aktualisieren Sie die neue Pizza Hawaii mit einer PUT-Anforderung mit dem folgenden Befehl in eine Hawaiian-Pizza:

    put 3 -c  "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
    

    Der vorherige Befehl gibt die folgende Ausgabe zurück, die Erfolg angibt:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:23:55 GMT
    Server: Kestrel
    

    Führen Sie die GET-Aktion mit dem folgenden Befehl erneut aus, um zu überprüfen, ob die Pizza aktualisiert wurde:

    get 3
    

    Der vorherige Befehl gibt die neu aktualisierte Pizza zurück:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:27:37 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 3,
        "name": "Hawaiian",
        "isGlutenFree": false
    }
    
  7. Unsere API kann auch die neu erstellte Pizza mit der DELETE-Aktion löschen, wenn Sie den folgenden Befehl ausführen:

    delete 3
    

    Der vorherige Befehl gibt ein Ergebnis 204 No Content für den Erfolg zurück:

    HTTP/1.1 204 No Content
    Date: Fri, 02 Apr 2021 23:30:04 GMT
    Server: Kestrel
    

    Führen Sie die GET-Aktion mit dem folgenden Befehl erneut aus, um zu überprüfen, ob die Pizza entfernt wurde:

    get
    

    Der vorherige Befehl gibt die ursprünglichen Pizzas als Ergebnisse zurück:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 23:31:15 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]
    

Sie haben nun die Implementierung und das Testen der mit ASP.NET Core neu erstellten Web-API abgeschlossen.