Exercício: adicionar um controlador

Concluído

Um controlador é uma classe pública com um ou mais métodos públicos conhecidos como ações. Por convenção, um controlador é colocado no diretório Controllers da raiz do projeto. As ações são expostas como pontos de extremidade HTTP dentro do controlador de API da Web.

Criar um controlador

  1. Selecione a pasta Controllers no Visual Studio Code e adicione um novo arquivo chamado PizzaController.cs.

    Captura de tela do Visual Studio Code que mostra a adição de um novo arquivo à pasta Controllers.

    Um arquivo de classe vazio chamado PizzaController.cs é criado no diretório Controllers . O nome do diretório Controllers é uma convenção. O nome do diretório vem da arquitetura model-view-controller que a API da Web usa.

    Nota

    Por convenção, os nomes das classes de controladores têm o sufixo Controller.

  2. Adicione o seguinte código a Controllers/PizzaController.cs. Guardar as suas alterações.

    using ContosoPizza.Models;
    using ContosoPizza.Services;
    using Microsoft.AspNetCore.Mvc;
    
    namespace ContosoPizza.Controllers;
    
    [ApiController]
    [Route("[controller]")]
    public class PizzaController : ControllerBase
    {
        public PizzaController()
        {
        }
    
        // GET all action
    
        // GET by Id action
    
        // POST action
    
        // PUT action
    
        // DELETE action
    }
    

    Como você aprendeu anteriormente, essa classe deriva de ControllerBase, a classe base para trabalhar com solicitações HTTP no ASP.NET Core. Ele também inclui os dois atributos padrão sobre os quais você aprendeu: [ApiController] e [Route]. Como antes, o [Route] atributo define um mapeamento para o [controller] token. Como essa classe de controlador é chamada PizzaController, ele manipula solicitações para https://localhost:{PORT}/pizza.

Obter todas as pizzas

O primeiro verbo REST que você precisa implementar é GET, onde um cliente pode obter todas as pizzas da API. Você pode usar o atributo embutido [HttpGet] para definir um método que retorna as pizzas do nosso serviço.

Substitua o // GET all action comentário em Controllers/PizzaController.cs pelo seguinte código:

[HttpGet]
public ActionResult<List<Pizza>> GetAll() =>
    PizzaService.GetAll();

A ação anterior:

  • Responde apenas ao verbo HTTP GET , conforme indicado pelo [HttpGet] atributo.
  • Retorna uma ActionResult instância do tipo List<Pizza>. O ActionResult tipo é a classe base para todos os resultados de ação no ASP.NET Core.
  • Consulta o serviço para todas as pizzas e retorna automaticamente os dados com um Content-Type valor de application/json.

Recuperar uma única pizza

O cliente também pode querer solicitar informações sobre uma pizza específica em vez de toda a lista. Você pode implementar outra GET ação que exija um id parâmetro. Você pode usar o atributo embutido [HttpGet("{id}")] para definir um método que retorna as pizzas do nosso serviço. A lógica de roteamento [HttpGet] registra (sem id) e [HttpGet("{id}")] (com id) como duas rotas diferentes. Em seguida, você pode escrever uma ação separada para recuperar um único item.

Substitua o // GET by Id action comentário em Controllers/PizzaController.cs pelo seguinte código:

[HttpGet("{id}")]
public ActionResult<Pizza> Get(int id)
{
    var pizza = PizzaService.Get(id);

    if(pizza == null)
        return NotFound();

    return pizza;
}

A ação anterior:

  • Responde apenas ao verbo HTTP GET , conforme indicado pelo [HttpGet] atributo.
  • Requer que o id valor do parâmetro seja incluído no segmento de URL após pizza/. Lembre-se, o atributo de nível [Route] de controlador definiu o /pizza padrão.
  • Consulta o banco de dados em busca de uma pizza que corresponda ao parâmetro fornecido id .

Cada ActionResult instância usada na ação anterior é mapeada para o código de status HTTP correspondente na tabela a seguir:

ASP.NET Core
resultado da ação
Código de estado de HTTP Descrição
Ok está implícito 200 Existe um produto que corresponde ao parâmetro fornecido id no cache na memória.
O produto é incluído no corpo da resposta no tipo de mídia, conforme definido no cabeçalho da accept solicitação HTTP (JSON por padrão).
NotFound 404 Um produto que corresponda ao parâmetro fornecido id não existe no cache na memória.

Compilar e executar o novo controlador

Crie e inicie a API da Web executando o seguinte comando:

dotnet run

Teste o controlador com um arquivo Http

  1. Abra ContosoPizza.http

  2. Adicione um novo GET para chamar o Pizza ponto de extremidade sob o ### separador:

    GET {{ContosoPizza_HostAddress}}/pizza/
    Accept: application/json
    
    ###
    
  3. Selecione o comando Enviar solicitação acima desta nova chamada GET .

    O comando anterior retorna uma lista de todas as pizzas em JSON:

    HTTP/1.1 200 OK
    Connection: close
    Content-Type: application/json; charset=utf-8
    Date: Wed, 17 Jan 2024 16:57:09 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    [
        {
            "id": 1,
            "name": "Classic Italian",
            "isGlutenFree": false
        },
        {
            "id": 2,
            "name": "Veggie",
            "isGlutenFree": true
        }
    ]   
    
  4. Para consultar uma única pizza, você pode fazer outra GET solicitação, mas passar um id parâmetro usando o seguinte comando:

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

    O comando anterior retorna Classic Italian com a seguinte saída:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  5. Nossa API também lida com situações em que o item não existe. Chame a API novamente, mas passe um parâmetro pizza id inválido usando o seguinte comando:

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

    O comando anterior retorna um 404 Not Found erro com a seguinte saída:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    

Agora que você terminou de implementar os verbos GET . Na próxima unidade, você pode adicionar mais ações para PizzaController apoiar operações CRUD em dados de pizza.

Opcional: Teste o controlador com o Loop de Leitura-Eval-Impressão HTTP de Linha de Comando (REPL)

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

  2. Conecte-se à nossa 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. Para ver o ponto de extremidade recém-disponível Pizza , execute o seguinte comando:

    ls
    

    O comando anterior deteta todas as APIs disponíveis no ponto de extremidade conectado. Ele deve exibir o seguinte código:

     https://localhost:{PORT}/> ls
     .                 []
     Pizza             [GET]
     WeatherForecast   [GET]
    
  4. Vá para o Pizza ponto de extremidade executando o seguinte comando:

    cd Pizza
    

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

    https://localhost:{PORT}/> cd Pizza
    /Pizza    [GET]
    
  5. Faça uma GET solicitação usando HttpRepl o seguinte comando:

    get
    

    O comando anterior retorna uma lista de todas as pizzas em JSON:

      HTTP/1.1 200 OK
      Content-Type: application/json; charset=utf-8
      Date: Fri, 02 Apr 2021 21:55:53 GMT
      Server: Kestrel
      Transfer-Encoding: chunked
    
      [
          {
              "id": 1,
              "name": "Classic Italian",
              "isGlutenFree": false
          },
          {
              "id": 2,
              "name": "Veggie",
              "isGlutenFree": true
          }
      ]
    
  6. Para consultar uma única pizza, você pode fazer outra GET solicitação, mas passar um id parâmetro usando o seguinte comando:

    get 1
    

    O comando anterior retorna Classic Italian com a seguinte saída:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Date: Fri, 02 Apr 2021 21:57:57 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "id": 1,
        "name": "Classic Italian",
        "isGlutenFree": false
    }
    
  7. Nossa API também lida com situações em que o item não existe. Chame a API novamente, mas passe um parâmetro pizza id inválido usando o seguinte comando:

    get 5
    

    O comando anterior retorna um 404 Not Found erro com a seguinte saída:

    HTTP/1.1 404 Not Found
    Content-Type: application/problem+json; charset=utf-8
    Date: Fri, 02 Apr 2021 22:03:06 GMT
    Server: Kestrel
    Transfer-Encoding: chunked
    
    {
        "type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
        "title": "Not Found",
        "status": 404,
        "traceId": "00-ec263e401ec554b6a2f3e216a1d1fac5-4b40b8023d56762c-00"
    }
    
  8. Retorne ao dotnet terminal na lista suspensa no Visual Studio Code e desligue a API da Web selecionando CTRL+C no teclado.

Agora que você terminou de implementar os verbos GET . Na próxima unidade, você pode adicionar mais ações para PizzaController apoiar operações CRUD em dados de pizza.