Exercício: adicionar um controlador
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
Selecione a pasta Controllers no Visual Studio Code e adicione um novo arquivo chamado PizzaController.cs.
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.
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 é chamadaPizzaController, ele manipula solicitações parahttps://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
ActionResultinstância do tipoList<Pizza>. OActionResulttipo é 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-Typevalor deapplication/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
idvalor do parâmetro seja incluído no segmento de URL apóspizza/. Lembre-se, o atributo de nível[Route]de controlador definiu o/pizzapadrã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
Abra ContosoPizza.http
Adicione um novo GET para chamar o
Pizzaponto de extremidade sob o ### separador:GET {{ContosoPizza_HostAddress}}/pizza/ Accept: application/json ###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 } ]Para consultar uma única pizza, você pode fazer outra
GETsolicitação, mas passar umidparâmetro usando o seguinte comando:GET {{ContosoPizza_HostAddress}}/pizza/1 Accept: application/json ###O comando anterior retorna
Classic Italiancom 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 }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
idinválido usando o seguinte comando:GET {{ContosoPizza_HostAddress}}/pizza/5 Accept: application/json ###O comando anterior retorna um
404 Not Founderro 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)
Abra o terminal existente
httpreplou abra um novo terminal integrado do Visual Studio Code selecionando Terminal>New Terminal no menu principal.Conecte-se à nossa 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}Para ver o ponto de extremidade recém-disponível
Pizza, execute o seguinte comando:lsO 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]Vá para o
Pizzaponto de extremidade executando o seguinte comando:cd PizzaO comando anterior mostra uma saída de APIs disponíveis para o
Pizzaponto de extremidade:https://localhost:{PORT}/> cd Pizza /Pizza [GET]Faça uma
GETsolicitação usandoHttpReplo seguinte comando:getO 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 } ]Para consultar uma única pizza, você pode fazer outra
GETsolicitação, mas passar umidparâmetro usando o seguinte comando:get 1O comando anterior retorna
Classic Italiancom 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 }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
idinválido usando o seguinte comando:get 5O comando anterior retorna um
404 Not Founderro 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" }Retorne ao
dotnetterminal 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.