Exercício: implementar operações CRUD

Concluído

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 Pizza solicitaçã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 id valor do parâmetro seja incluído no segmento de URL após pizza/.
  • Retorna IActionResult, porque o tipo de retorno não é conhecido até o ActionResult tempo de execução. O BadRequest, NotFound, e NoContent os métodos retornam BadRequestResult, NotFoundResult, e NoContentResult tipos, 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 id valor do parâmetro seja incluído no segmento de URL após pizza/.
  • Devolve IActionResult porque o tipo de devolução ActionResult não é conhecido até ao runtime. Os métodos NotFound e NoContent devolvem os tipos NotFoundResult e NoContentResult, 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

  1. Reabra o arquivo ContosoPizza.http .

  2. Faça uma POST solicitação para adicionar uma nova pizza usando HttpRepl o 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
    }
    
  3. Atualize a nova Hawaii pizza para uma Hawaiian pizza com uma PUT solicitaçã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: Kestrel
    

    Para verificar se a pizza foi atualizada, execute novamente a GET açã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
    }
    
  4. Nossa API também pode excluir a pizza recém-criada através da DELETE ação se você executar o seguinte comando:

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

    O comando anterior retorna um 204 No Content resultado para êxito:

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

    Para verificar se a pizza foi removida, execute novamente a GET açã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

  1. Reabra o terminal existente httprepl ou abra um novo terminal integrado do Visual Studio Code selecionando Terminal>New Terminal no menu principal.

  2. 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 HttpRepl a execução:

    connect https://localhost:{PORT}
    
  3. Vá para o Pizza ponto de extremidade executando o seguinte comando:

    cd Pizza
    
  4. Execute o seguinte comando para ver as novas ações na API Pizza:

    ls
    

    O comando anterior mostra uma saída de APIs disponíveis para o Pizza ponto de extremidade:

        https://localhost:{PORT}/Pizza> ls
        .      [GET|POST]
        ..     []
        {id}   [GET|PUT|DELETE]
    
  5. Faça uma POST solicitação para adicionar uma nova pizza usando HttpRepl o 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
    }
    
  6. Atualize a nova Hawaii pizza para uma Hawaiian pizza com uma PUT solicitaçã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: Kestrel
    

    Para verificar se a pizza foi atualizada, execute novamente a GET ação usando o seguinte comando:

    get 3
    

    O 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
    }
    
  7. Nossa API também pode excluir a pizza recém-criada através da DELETE ação se você executar o seguinte comando:

    delete 3
    

    O comando anterior retorna um 204 No Content resultado para êxito:

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

    Para verificar se a pizza foi removida, execute novamente a GET ação usando o seguinte comando:

    get
    

    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.