Övning – Implementera CRUD-åtgärder
Nu ska vi fortsätta utöka vår webb-API-kontrollant för att lägga till möjligheten att skapa (POST
), uppdatera (PUT
) och ta bort (DELETE
) pizza från vårt lager.
Lägg till en pizza
Nu ska vi göra det möjligt att lägga till en pizza via webb-API:et med hjälp av en POST
metod.
Ersätt kommentaren // POST action
i Controllers/PizzaController.cs med följande kod:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
Föregående åtgärd:
- Svarar endast på HTTP-verbet
POST
, vilket anges av[HttpPost]
attributet. - Infogar begärandetextens
Pizza
objekt i minnesintern cacheminnet.
Kommentar
Eftersom kontrollanten kommenteras med [ApiController]
-attributet är det underförstått att Pizza
-parametern finns i begärandetexten.
Den första parametern i CreatedAtAction
-metodanropet representerar ett åtgärdsnamn. nameof
-nyckelordet används för att undvika hårdkodning av åtgärdsnamnet. CreatedAtAction
använder åtgärdsnamnet för att generera ett location
HTTP-svarshuvud med en URL till den nyligen skapade pizzan, enligt beskrivningen i föregående lektion.
Ändra en pizza
Nu ska vi aktivera en pizza som ska uppdateras via webb-API:et med hjälp av en PUT
metod.
Ersätt kommentaren // PUT action
i Controllers/PizzaController.cs med följande kod:
[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();
}
Föregående åtgärd:
- Svarar endast på HTTP PUT-verbet, vilket anges av
[HttpPut]
-attributet. - Kräver att
id
parameterns värde ingår i URL-segmentet efterpizza/
. - Returnerar
IActionResult
, eftersomActionResult
returtypen inte är känd förrän körningen. MetodernaBadRequest
,NotFound
, ochNoContent
returnerarBadRequestResult
,NotFoundResult
respektiveNoContentResult
typer.
Kommentar
Eftersom kontrollanten kommenteras med [ApiController]
-attributet är det underförstått att Pizza
-parametern finns i begärandetexten.
Ta bort en pizza
Slutligen ska vi aktivera att en pizza tas bort via webb-API:et med hjälp av en DELETE
metod.
Ersätt kommentaren // DELETE action
i Controllers/PizzaController.cs med följande kod:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
Föregående åtgärd:
- Svarar endast på HTTP-verbet
DELETE
, vilket anges av[HttpDelete]
attributet. - Kräver att
id
parameterns värde ingår i URL-segmentet efterpizza/
. - Returnerar
IActionResult
eftersom returneringstypenActionResult
inte är känd förrän körningen. MetodernaNotFound
ochNoContent
returnerar typernaNotFoundResult
respektiveNoContentResult
. - Frågar minnesintern cache för en pizza som matchar den angivna
id
parametern.
Kom ihåg att spara filen Controllers/PizzaController.cs innan du fortsätter.
Skapa och kör det färdiga webb-API:et
Skapa och starta webb-API:et genom att köra följande kommando:
dotnet run
Testa det färdiga webb-API:et med HTTP-filer
Öppna filen ContosoPizza.http igen.
Gör en
POST
begäran om att lägga till en ny pizza iHttpRepl
med hjälp av följande kommando:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###
Föregående kommando returnerar den nyligen skapade pizzan:
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 }
Uppdatera den nya
Hawaii
pizzan till enHawaiian
pizza med enPUT
begäran med hjälp av följande kommando:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###
Föregående kommando returnerar följande utdata som indikerar att det lyckades:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: Kestrel
Kontrollera att pizzan har uppdaterats genom att köra
GET
åtgärden igen med hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###
Föregående kommando returnerar den nyligen uppdaterade pizzan:
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 }
Vårt API kan också ta bort den nyligen skapade pizzan genom åtgärden
DELETE
om du kör följande kommando:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###
Föregående kommando returnerar ett
204 No Content
resultat för lyckat resultat:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Kontrollera att pizzan har tagits bort genom att köra
GET
åtgärden igen med hjälp av följande kommando:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###
Föregående kommando returnerar de ursprungliga pizzorna som resultat:
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 } ]
Nu är du klar med att implementera och testa ett nyligen skapat webb-API som skapats med ASP.NET Core.
Valfritt: Testa det färdiga webb-API:et med kommandoraden HTTPREPL
Öppna den befintliga
httprepl
terminalen igen eller öppna en ny integrerad terminal från Visual Studio Code genom att välja Terminal>Ny terminal på huvudmenyn.Om du öppnade en ny terminal ansluter du till webb-API:et genom att köra följande kommando:
httprepl https://localhost:{PORT}
Du kan också köra följande kommando när som helst medan
HttpRepl
det körs:connect https://localhost:{PORT}
Gå till slutpunkten genom att
Pizza
köra följande kommando:cd Pizza
Kör följande kommando för att se de nya åtgärderna i Pizza-API:et:
ls
Föregående kommando visar utdata från tillgängliga API:er för
Pizza
slutpunkten:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]
Gör en
POST
begäran om att lägga till en ny pizza iHttpRepl
med hjälp av följande kommando:post -c "{"name":"Hawaii", "isGlutenFree":false}"
Föregående kommando returnerar den nyligen skapade pizzan:
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 }
Uppdatera den nya
Hawaii
pizzan till enHawaiian
pizza med enPUT
begäran med hjälp av följande kommando:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"
Föregående kommando returnerar följande utdata som indikerar att det lyckades:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: Kestrel
Kontrollera att pizzan har uppdaterats genom att köra
GET
åtgärden igen med hjälp av följande kommando:get 3
Föregående kommando returnerar den nyligen uppdaterade pizzan:
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 }
Vårt API kan också ta bort den nyligen skapade pizzan genom åtgärden
DELETE
om du kör följande kommando:delete 3
Föregående kommando returnerar ett
204 No Content
resultat för lyckat resultat:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: Kestrel
Kontrollera att pizzan har tagits bort genom att köra
GET
åtgärden igen med hjälp av följande kommando:get
Föregående kommando returnerar de ursprungliga pizzorna som resultat:
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 } ]
Nu är du klar med att implementera och testa ett nyligen skapat webb-API som skapats med ASP.NET Core.