Ö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
Pizzaobjekt 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
idparameterns värde ingår i URL-segmentet efterpizza/. - Returnerar
IActionResult, eftersomActionResultreturtypen inte är känd förrän körningen. MetodernaBadRequest,NotFound, ochNoContentreturnerarBadRequestResult,NotFoundResultrespektiveNoContentResulttyper.
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
idparameterns värde ingår i URL-segmentet efterpizza/. - Returnerar
IActionResulteftersom returneringstypenActionResultinte är känd förrän körningen. MetodernaNotFoundochNoContentreturnerar typernaNotFoundResultrespektiveNoContentResult. - Frågar minnesintern cache för en pizza som matchar den angivna
idparametern.
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
POSTbegäran om att lägga till en ny pizza iHttpReplmed 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
Hawaiipizzan till enHawaiianpizza med enPUTbegä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: KestrelKontrollera 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
DELETEom du kör följande kommando:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###Föregående kommando returnerar ett
204 No Contentresultat för lyckat resultat:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelKontrollera 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
httpreplterminalen 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
HttpRepldet körs:connect https://localhost:{PORT}Gå till slutpunkten genom att
Pizzaköra följande kommando:cd PizzaKör följande kommando för att se de nya åtgärderna i Pizza-API:et:
lsFöregående kommando visar utdata från tillgängliga API:er för
Pizzaslutpunkten:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Gör en
POSTbegäran om att lägga till en ny pizza iHttpReplmed 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
Hawaiipizzan till enHawaiianpizza med enPUTbegä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: KestrelKontrollera att pizzan har uppdaterats genom att köra
GETåtgärden igen med hjälp av följande kommando:get 3Fö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
DELETEom du kör följande kommando:delete 3Föregående kommando returnerar ett
204 No Contentresultat för lyckat resultat:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelKontrollera att pizzan har tagits bort genom att köra
GETåtgärden igen med hjälp av följande kommando:getFö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.