APIs e Microsserviços

1 mar, 2018

Como construir uma API com Symfony 3.4 – Parte 02

Publicidade

Olá, tudo bem?

Continuando a nossa jornada, onde criaremos uma API de cervejas com o Symfony 3.4, daremos início aos nossos endpoints de recuperação. Um para todas as cervejas e um de recuperação de um cerveja em específico.

Então basicamente, teremos até o fim do artigo:

GET /beers
GET /beer/{id}

Episódio passado

Se você caiu de paraquedas neste artigo, em nosso artigo anterior, fizemos o startup de nossa aplicação, bem como as configurações necessárias para nossos retornos em JSON. Dá uma olhadinha lá!

Continuando

Continuando nosso artigo, o primeiro passo é criarmos nossa entidade. Um comentário rápido: o ORM default do Symfony é o Doctrine. Utilizaremos o mesmo para gerenciamento e mapeamento de nossas entidades.

Gerando entidade Beer

O Symfony console nos auxiliará bastante no momento de geração de nossa entidade, facilitando assim, nosso trabalho. Para realizar a geração, execute o comando abaixo na raiz do seu projeto:

bin/console doctrine:generate:entity

Você será guiado por algumas perguntas. Não me delongarei nesse processo, pois criei material em vídeo sobre o assunto. Basta acompanhar abaixo:

Segue abaixo o link da nossa entidade gerada:

Para gerarmos nosso schema/table baseado em nossa entidade, basta executarmos o comando abaixo:

bin/console doctrine:schema:create

Com nosso banco atualizado, vamos à criação do nosso controller que comportará nossos primeiros endpoints!

Gerando & criando BeerController

Sobre a geração de controllers no Symfony, te recomendo outro vídeo para que você possa iniciar. Segue abaixo:

Para gerarmos nosso controller, basta que executemos na raiz do nosso projeto, o comando a seguir:

bin/console generate:controller

Nosso controller terá, a priore, dois métodos. O método index e o método show. Nosso método index retornará todas as cervejas de nossa base, e o método show servirá para mostrarmos os detalhes de uma cerveja em específico.

Vamos por partes aqui! Código do nosso método index:

Um adendo rápido: nosso controller Beer recebe uma annotation para route indicando que a rota para aquele controller é /beers. Juntando com as rotas em cada action, montamos os recursos completos, facilitando assim, a escrita.

Nosso index é bem tranquilo, dado o escopo dessa série. Recuperamos do nosso banco todas as cervejas utilizando o Doctrine, baseado em nossa entidade Beer, que se encontra em nosso APIBundle.

Para retorno de nossos dados, vamos utilizar o JsonResponse, que retorna um json para nós com base no array ou objeto que é passado como primeiro parâmetro em seu construtor.

Para testarmos esse método, vamos iniciar nosso servidor e acessar o link: http://127.0.0.1:8001/api/beers/.

Ops! Tivemos um retorno vazio, mesmo existindo dados no banco. Neste caso, como temos aqui objetos com estrutura complexa para ser exibido, precisamos serializar esse retorno. Para isso, irei utilizar o JSM Serializer para me auxiliar nesse processo.

Para instalarmos, basta executarmos na raiz do nosso projeto, o comando abaixo:

composer require jms/serializer-bundle

Após o download, não esqueça de registrar o bundle em seu arquivo AppKernel.php.

Vamos alterar um pouco nosso método index:

Agora adicionamos no meio do processo, a serialização dos nossos dados vindos do Doctrine. Chamamos o serviço jms_serializer, passando para o método serialize nossos objetos e indicamos o tipo de retorno esperado na serialização.

O retorno da serialização será nossa string json. Vou utilizar desta vez nosso saudoso Response, alterando apenas o Content-Type dos headers de retorno para application/json.

Vamos retornar ao nosso browser e testar novamente, veja abaixo:

Recuperando uma cerveja em específico

Agora que temos nosso endpoint GET /beers, vamos ao nosso endpoint GET /beers/{id}. Este endpoint retorna uma cerveja com base no ID passado.

Veja abaixo:

Nosso método show, que retorna apenas uma cerveja com base no id informado não tem muita diferença aqui, a não ser um ponto em especial.

O ponto em especial aqui é a utilização de um recurso do SF, chamado de parameter converter, onde, ao induzirmos o tipo do parâmetro com um entidade válida, o Symfony tentará retornar o objeto com base no id informado na URL, trazendo assim, no parâmetro beer, nossa cerveja esperada. Caso não exista um dado com o ID informado, um 404 — NOT FOUND é lançado para nós.

Recomendo a leitura do parameter converter clicando aqui.

Ao buscarmos pela cerveja de ID 1, acessando a url http://127.0.0.1:8001/api/beers/1, temos o resultado:

Link para o nosso Controller na faixa:

Conclusão

Chegamos ao ponto proposto para essa segunda etapa. A criação de nossos endpoints de recuperação, todas e uma, em relação a nossas cervejas. Em nosso próximo artigo, vamos criar nossos endpoints de criação e atualização.

Espero que esse artigo possa te ajudar imensamente. Dúvidas? Não deixe de comentar abaixo! Abraços.