Exercício: implementar operações CRUD
Vamos continuar estendendo nosso controlador de API da Web para adicionar a capacidade de criar (POST), atualizar (PUT) e excluir (DELETE) pizza do nosso inventário.
Adicionar uma pizza
Vamos permitir que uma pizza seja adicionada através da API da Web usando um POST método.
Substitua o comentário // POST action em Controllers/PizzaController.cs pelo seguinte código:
[HttpPost]
public IActionResult Create(Pizza pizza)
{
PizzaService.Add(pizza);
return CreatedAtAction(nameof(Get), new { id = pizza.Id }, pizza);
}
A ação anterior:
- Responde apenas ao verbo HTTP
POST, conforme indicado pelo[HttpPost]atributo. - Insere o objeto do corpo da
Pizzasolicitação no cache na memória.
Nota
Dado que o controlador está anotado com o atributo [ApiController], está implícito que o parâmetro Pizza será encontrado no corpo do pedido.
O primeiro parâmetro na chamada do método CreatedAtAction representa o nome de uma ação. A palavra-chave nameof é utilizada para evitar o processo de hard-coding do nome da ação.
CreatedAtAction usa o nome da ação para gerar um cabeçalho de location resposta HTTP com uma URL para a pizza recém-criada, conforme explicado na unidade anterior.
Modificar uma pizza
Agora, vamos permitir que uma pizza seja atualizada através da API da Web usando um PUT método.
Substitua o comentário // PUT action em Controllers/PizzaController.cs pelo seguinte código:
[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();
}
A ação anterior:
- Responde apenas ao verbo HTTP PUT, conforme indicado pelo atributo
[HttpPut]. - Requer que o
idvalor do parâmetro seja incluído no segmento de URL apóspizza/. - Retorna
IActionResult, porque o tipo de retorno não é conhecido até oActionResulttempo de execução. OBadRequest,NotFound, eNoContentos métodos retornamBadRequestResult,NotFoundResult, eNoContentResulttipos, respectivamente.
Nota
Dado que o controlador está anotado com o atributo [ApiController], está implícito que o parâmetro Pizza será encontrado no corpo do pedido.
Remover uma pizza
Finalmente, vamos permitir que uma pizza seja removida através da API da Web usando um DELETE método.
Substitua o comentário // DELETE action em Controllers/PizzaController.cs pelo seguinte código:
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var pizza = PizzaService.Get(id);
if (pizza is null)
return NotFound();
PizzaService.Delete(id);
return NoContent();
}
A ação anterior:
- Responde apenas ao verbo HTTP
DELETE, conforme indicado pelo[HttpDelete]atributo. - Requer que o
idvalor do parâmetro seja incluído no segmento de URL apóspizza/. - Devolve
IActionResultporque o tipo de devoluçãoActionResultnão é conhecido até ao runtime. Os métodosNotFoundeNoContentdevolvem os tiposNotFoundResulteNoContentResult, respetivamente. - Consulta o cache na memória em busca de uma pizza que corresponda ao parâmetro fornecido
id.
Lembre-se de salvar o arquivo Controllers/PizzaController.cs antes de prosseguir,
Criar e executar a API da Web concluída
Crie e inicie a API da Web executando o seguinte comando:
dotnet run
Teste a API da Web concluída com arquivos HTTP
Reabra o arquivo ContosoPizza.http .
Faça uma
POSTsolicitação para adicionar uma nova pizza usandoHttpReplo seguinte comando:POST {{ContosoPizza_HostAddress}}/pizza/ Content-Type: application/json { "name": "Hawaii", "isGlutenFree": false } ###O comando anterior retorna a pizza recém-criada:
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 }Atualize a nova
Hawaiipizza para umaHawaiianpizza com umaPUTsolicitação usando o seguinte comando:PUT {{ContosoPizza_HostAddress}}/pizza/3 Content-Type: application/json { "id": 3, "name": "Hawaiian", "isGlutenFree": false } ###O comando anterior retorna a seguinte saída que indica sucesso:
HTTP/1.1 204 No Content Connection: close Date: Wed, 17 Jan 2024 17:07:30 GMT Server: KestrelPara verificar se a pizza foi atualizada, execute novamente a
GETação usando o seguinte comando:GET {{ContosoPizza_HostAddress}}/pizza/3 Accept: application/json ###O comando anterior retorna a pizza recém-atualizada:
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 }Nossa API também pode excluir a pizza recém-criada através da
DELETEação se você executar o seguinte comando:DELETE {{ContosoPizza_HostAddress}}/pizza/3 ###O comando anterior retorna um
204 No Contentresultado para êxito:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPara verificar se a pizza foi removida, execute novamente a
GETação usando o seguinte comando:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###O comando anterior retorna as pizzas originais como resultados:
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 } ]
Agora você terminou de implementar e testar uma API da Web recém-criada criada com o ASP.NET Core.
Opcional: Teste a API da Web concluída com HTTPREPL de linha de comando
Reabra o terminal existente
httpreplou abra um novo terminal integrado do Visual Studio Code selecionando Terminal>New Terminal no menu principal.Se você abriu um novo terminal, conecte-se à API da Web executando o seguinte comando:
httprepl https://localhost:{PORT}Como alternativa, execute o seguinte comando a qualquer momento durante
HttpRepla execução:connect https://localhost:{PORT}Vá para o
Pizzaponto de extremidade executando o seguinte comando:cd PizzaExecute o seguinte comando para ver as novas ações na API Pizza:
lsO comando anterior mostra uma saída de APIs disponíveis para o
Pizzaponto de extremidade:https://localhost:{PORT}/Pizza> ls . [GET|POST] .. [] {id} [GET|PUT|DELETE]Faça uma
POSTsolicitação para adicionar uma nova pizza usandoHttpReplo seguinte comando:post -c "{"name":"Hawaii", "isGlutenFree":false}"O comando anterior retorna a pizza recém-criada:
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 }Atualize a nova
Hawaiipizza para umaHawaiianpizza com umaPUTsolicitação usando o seguinte comando:put 3 -c "{"id": 3, "name":"Hawaiian", "isGlutenFree":false}"O comando anterior retorna a seguinte saída que indica sucesso:
HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:23:55 GMT Server: KestrelPara verificar se a pizza foi atualizada, execute novamente a
GETação usando o seguinte comando:get 3O comando anterior retorna a pizza recém-atualizada:
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 }Nossa API também pode excluir a pizza recém-criada através da
DELETEação se você executar o seguinte comando:delete 3O comando anterior retorna um
204 No Contentresultado para êxito:HTTP/1.1 204 No Content Date: Fri, 02 Apr 2021 23:30:04 GMT Server: KestrelPara verificar se a pizza foi removida, execute novamente a
GETação usando o seguinte comando:getO comando anterior retorna as pizzas originais como resultados:
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 } ]
Agora você terminou de implementar e testar uma API da Web recém-criada criada com o ASP.NET Core.