SlideShare uma empresa Scribd logo
1 de 87
API
PLATFORM
Hello!
Eu sou Bruno Souza!
➔ Analista de Sistemas - MRE pela empresa Datainfo
➔ Graduado em Análise e Desenvolvimento de Sistemas - UNIP
➔ Pós-graduando em Big Data e Ciência de Dados - PUC Minas
➔ ZCPE
➔ Microsoft Specialist - HTML5, CSS e JS
@Bruno_HSouza brunohsouza
A utilização de APIs traz algumas vantagens como:
➔ Grande oportunidade de negócios para empresas;
➔ Novos fluxos de receita
➔ Maximização de valores para os clientes e negócio
➔ Expansão de mercado
➔ Ponto central de processamento e acesso aos dados
➔ Encapsulamento da lógica de negócios
➔ Disponibilização das funcionalidades em diversos dispositivos
A ascensão do uso de API’s em uma abordagem técnica se torna um desafio, pois a
arquitetura deve ser:
➔ Sólida;
➔ Segura;
➔ Performática;
➔ Flexível;
➔ Auto-escalável;
➔ Resiliente;
➔ Altamente disponível
O que é o API Platform?
Um conjunto de ferramentas para facilitar a criação e o
consumo de Web API’s.
Segundo o conceito de plataforma em TI, pode ser definido
como: um grupo de tecnologias que são usadas como
base sobre a qual outras aplicações, processos ou
tecnologias são desenvolvidas.
O que é o API Platform?
Visa oferecer um conjunto de ferramentas e
padrões para facilitar a construção de sistemas
baseados em API.
“ API Platform is the most
advanced API platform, in
any framework or language.
Fabien Potencier
➔ Desenvolvido por Kévin Dunglas
➔ Possui 4.172 estrelas no Git Hub [17 de maio de 2019
]
➔ 437 Forks no Git Hub [17 de maio de 2019]
➔ Versão 2.4.2 [17 de maio de 2019]
Getting Start
Instalação
10
A forma recomendada para a instalação do API Platform e utilização de uma forma mais
rápida é via docker-compose. Para isto, basta:
1. Baixar uma versão de sua distribuição oficial ou via git clone pelo github;
2. Instalar o Docker (caso já não tenha feito);
3. Abrir o terminal onde está o skeleton do projeto;
4. Executar os comandos:
a. docker-compose pull - para baixar a última versão da imagem
b. docker-compose up -d - para executar em background ou docker-
compose up para executar em primeira tela, permitindo visualizar os logs de
acesso e erro referentes aos containers;
Demo Instalação
12
Distribuição dos containers
Nome Descrição Porta(s)
php Onde fica a API e o seu código-fonte, composer e configs 9000 | n/a
db Um servidor de banco de dados com o PostgresSQL 5432
client Um servidor de desenvolvimento para a camada front-end (PWA, SPA) 80
admin Um servidor de desenvolvimento para gerenciamento do conteúdo do site 81
cache-proxy Um servidor HTTP de cache proxy baseado em Varnish 8081
mercure Servidor dedicado para execução do protocolo Mercure 443
h2-proxy Um servidor HTTPS e HTTP/2 com proxy para todos os apps 443 (client)
444 (admin)
8443 (api)
8444 (cache-proxy)
Isto é demais para
você ou o seu
projeto?
Instalando com Composer
16
Você pode fazer a instalação via Composer, utilizando a estrutura do Symfony Flex e a recipe
para o API Platform. Para isto, basta executar os seguintes passos:
➔ Execute: composer create-project symfony/skeleton my-api
➔ Entre no diretório de instalação e execute o comando: composer req api
➔ Para executar a API com o WebServerBundle: composer req server-dev
➔ Para visualização do site execute: bin/console server:run
➔ Acesse o localhost do server, geralmente http://127.0.0.1:8000;
➔ Para acessar a interface de documentação da API, acesse: http://127.0.0.1:8000/api
Estrutura
Distribuído em alguns componentes principais:
➔ The API Component;
➔ The Admin Component;
➔ The Client Component;
➔ The Schema Generator Component;
The Schema Generator
Component
O Schema Generator Component é uma ferramenta executada via linha de comando no
terminal (CLI) para facilitar e gerar modelos de dados instantâneos a partir do
vocabulário do site Schema.org;
O Schema.org é uma comunidade colaborativa fundada por
membros do Google, Microsoft, Yahoo e Yandex com a missão de
criar, manter e promover schemas para estruturas de dados na
internet.
Possui um vocabulário que pode ser utilizado em diversos
formatos. Este vocabulário é facilmente estendido e abordam
entidades, relacionamentos e actions.
Conjunto de vocábulos ou palavras representadas em uma
determinada língua
Vocabulário
Para utilizar o Schema Generator basta executar o comando no terminal:
docker-compose exec php vendor/bin/schema
Caso não esteja utilizando o API Platform com o docker é possível instalar o componente
via Composer executando o comando:
composer require --dev api-platform/schema-generator
Para executar o Schema Generator:
➔ acesse o site Schema.org, escolha os types e properties dos dados necessários para
a sua aplicação;
➔ Com os dados escolhidos, crie um arquivo chamado schema.yaml dentro do
diretório config da sua API e preencha conforme o modelo dos dados do
Schema.org;
➔ Execute o comando para gerar os modelos:
vendor/bin/schema generate-types src config/schema.yaml
types:
# Parent class of Person
Thing:
properties:
name: ~
Person:
properties:
familyName: ~
givenName: ~
additionalName: ~
address: ~
PostalAddress:
# Disable the generation of the class hierarchy for this type
parent: false
properties:
# Force the type of the addressCountry property to text
addressCountry: { range: "Text" }
addressLocality: ~
addressRegion: ~
postOfficeBoxNumber: ~
postalCode: ~
streetAddress: ~
The API Component
├── bin
├── config
│ ├── packages
│ └── routes
├── docker
│ ├── nginx
│ ├── php
│ └── varnish
├── helm
│ └── api
├── public
│ └── bundles
├── src
│ ├── Controller
│ ├── Entity
│ └── Repository
├── templates
└── var
Considerações
➔ Code First
➔ Design First
➔ @ApiResource annotation
➔ Data Persisters
➔ Data Providers
◆ CollectionDataProviderInterface
◆ ItemDataProviderInterface
➔ Padrões (CQS, CQRS, REST, GRAPHQL, Event Sourcing)
Operações
Método Obrigatório Descrição
GET SIM Recupera uma lista de elementos (paginados)
POST NÃO Cria um novo elemento
Método Obrigatório Descrição
GET SIM Recupera um elemento
PUT NÃO Altera um elemento
DELETE NÃO Deleta um elemento
Collection
Item
Habilitando/Desabilitando
Operações
➔ É possível habilitar ou desabilitar operações da seguinte forma:
/**
* A person (alive, dead, undead, or fictional).
* @see http://schema.org/Person Documentation on Schema.org
* @ORMEntity
* @ApiResource(iri="http://schema.org/Person"
* @collectionOperations={"create”={"method"="POST"}},
* @itemOperations={"find"={"method"="GET"}},
* )
*/
class Person
{
...
}
Configurando Operações
/**
* A person (alive, dead, undead, or fictional).
* @see http://schema.org/Person Documentation on Schema.org
* @ORMEntity
* @ApiResource(iri="http://schema.org/Person"
* @collectionOperations={"create”={"method"="POST"}},
* @itemOperations={"find"={"method"="GET", path=”/person/{id}”,
“requirements”={“id”=”d+”}, “defaults”={“color”=”brown”}, “options”={“my-
option”=”my-option-value”}, “schemes”={“https”}, “host”=”{subdomain}.api-
platform.com”, “put”=”method”=”PUT”, “path”=”/person/{id}”,
“hydra_context”={“foo”=”bar”}
},
* )
*/
class Person
Subresources
/**
* @ORMEntity
* @ApiResource(iri="http://schema.org/Person"
* subresourceOperations={
* “get_address_subresource”= {
* “method=”GET”, “path”=”/person/{id}/all-address”
* }
* },
* )
*/
class Person
{
/**
* @var PostalAddress|null physical address of the item
* @ORMManyToOne(targetEntity="AppEntityPostalAddress")
* @ApiProperty(iri="http://schema.org/address")
* @ApiSubresource(maxDepth=1)
*/
private $address;
{
"person": {
"@id": "/people/1",
"@type": "Person",
"additionalName": "Iron Man",
"address": {
"home": [{ ... },
"work": [{
"city": "New York",
"zipCode": "11445",
"country": "United States",
"coordinates": [{
"latitude": "-73.935242",
"longitude": "40.730610"
}]
}]
}]
},
"familyName": "Stark",
"givenName": "Tony",
"id": 1
}
}
Content Formats
Suporta alguns formatos de dados como:
○ json-ld {application/ld+json}
○ json {application/json}
○ json-hal {application/hal+json}
○ json-api {application/vnd.api+json}
○ csv {text/csv}
○ yaml {application/x-yaml}
○ xml {application/xml}
○ html {text/html}
○ my-format {application/vnd.my-format}
JSON-LD
Json-LD - Json for Linked Data
➔ É um formato de serialização utilizado na comunicação entre aplicações cliente e
servidor;
➔ Baseado na RFC4627
➔ Padronizado pela W3C recommandation (2014) para formatos de hypemedia;
➔ Fácil de usar: JSON em formato padrão, mas com algumas chaves especiais (@) e
mapeadas por contexto;
➔ Apoiado por empresas como: Google, BBC, Microsoft e órgãos governamentais de alguns
países (EUA e Europa);
➔ Compatível com tecnologias de web semântica: RDF, SPARQL, etc.
Json-LD Oferece
➔ Maior interoperabilidade entre os dados
➔ Mecanismo de identificação universal através de IRI’s (Internationalized Resource
Identifier)
➔ Forma de distinguir chaves compartilhadas por meio de mapeamentos através IRI’s e
contexts
➔ Mecanismo de referências entre objetos JSON
➔ Associação de tipos de dados
➔ Facilidade de expressar gráficos direcionados em um único documento
Json-LD (Objetivos)
➔ Simplicidade
➔ Compatibilidade
➔ Intensidade
➔ Internacionalização (@language)
➔ Expressividade
Linked Data Principles
➔ Usar as URI’s para nomear as coisas
➔ Use URIs HTTP para que as pessoas possam procurar o desejado
➔ Quando alguém pesquisar por URI’s, forneça informações úteis
➔ Inclua links para outras URI’s para que eles possam descobrir mais
dados
Tim Berners Lee
{
"@context": "https://json-ld.org/contexts/person.jsonld":
{
“@language”: "en-US"
},
"@id": "http://dbpedia.org/resource/Tony_Stark",
"name": "Tony Stark",
"born": "1940-10-09",
"spouse": "http://dbpedia.org/resource/Pepper_Potts"
}
Hydra
54
➔ É um padrão que permite uma construção mais amigável e interoperável de API’s;
➔ Sua fundação é baseada no Hydra Core Vocabulary (http://www.hydra-
cg.com/spec/latest/core/);
➔ Define alguns conceitos e fundamentos que permitem clientes entenderem como
interagir com API’s, uma vez que as informações estão disponíveis em um formato
genérico;
➔ Disponibiliza uma descoberta de entrypoints automaticamente se os cabeçalhos das
responses da API estiverem no formato estipulados pela RFC5988;
➔ Permite que os dados sejam lidos por humanos e máquinas através de markups;
{
"@context": "http://www.w3.org/ns/hydra/context.jsonld",
"@id": "http://api.example.com/doc/",
"@type": "ApiDocumentation",
"title": "The name of the API",
"description": "A short description of the API",
"entrypoint": "URL of the API's main entry point",
"supportedClass": [
... Classes known to be supported by the Web API ...
],
"possibleStatus": [
... Statuses that should be expected and handled properly ...
]
}
Segurança
➔ JSON Web Token (JWT) Authentication
➔ composer req lexik/jwt-authentication-bundle
➔ Requer configuração necessária
➔ Utiliza o Symfony Security Component
➔ Suporte ao OAuth
➔ Segue as orientações da OWASP (Open Web Application Security Project)
/**
* Secured resource.
*
* @ApiResource(
*
attributes={"access_control"="is_granted('ROLE_USER')"},
* collectionOperations={
* "get",
*
"post"={"access_control"="is_granted('ROLE_ADMIN')"}
* },
* itemOperations={
* "get"={"access_control"="is_granted('ROLE_USER')
and object.owner == user"}
* }
* )
* @ORMEntity
*/
class Person
Message Bus
/**
* @ApiResource(
* messenger=true,
* collectionOperations={
* "post"={"status"=202}
* },
* itemOperations={},
* output=false
* )
*/
final class ResetPasswordRequest
Baseado em Symfony
"symfony/http-foundation",
"symfony/http-kernel",
"symfony/property-access",
"symfony/property-info",
"symfony/serializer",
"symfony/web-link",
"symfony/validator",
"symfony/web-profiler-bundle",
"symfony/yaml"
"symfony/asset",
"symfony/cache",
"symfony/config",
"symfony/console",
"symfony/css-selector",
"symfony/debug",
"symfony/dependency-injection,
"symfony/doctrine-bridge",
"symfony/dom-crawler",
"symfony/event-dispatcher",
"symfony/expression-language",
"symfony/finder",
"symfony/form",
"symfony/framework-
bundle",
"symfony/mercure-bundle",
"symfony/messenger",
"symfony/phpunit-bridge",
"symfony/routing",
"symfony/security",
"symfony/security-bundle",
"symfony/twig-bundle",
Com base no Symfony Framework, possui várias funcionalidades como:
➔ Pagination
➔ Filters
➔ Ordenação
➔ Validates
➔ Serializer
➔ Router
➔ Tratamento de erros
➔ Cache
➔ Events
➔ Messenger
➔ Suporte aos Bundles do FOS
➔ Suporte à GraphQL
➔ Segurança
➔ Data Providers;
➔ Data Persisters;
➔ HTTPKernel
➔ HTTP/2
Integrações
Oferece suporte à outras funcionalidades, como:
➔ Autenticação com JSON Web Token (JWT);
➔ Autenticação com o OAuth utilizando FosOAuthServer;
➔ Envios de e-mails com Swift Mailer;
➔ Integração com RabbitMQ;
➔ Integração com o MongoDB;
➔ Integração com o Elastic Search;
➔ Integração e utilização do protocolo Mercure;
Controllers
➔ Qualquer Symfony Controller válida
➔ Recomenda-se utilizar o event system quando aplicável
➔ Utiliza o padrão ADR (Action-Domain-Responder)
Action
Domain Responder
API REST
➔ Criado em 2000 por Roy Fielding em uma tese de mestrado
➔ Recursos com identificação única (URI);
➔ Uma funcionalidade por verbo HTTP;
➔ Utiliza uma interface única para requisições;
➔ Utiliza JSON como formato padrão;
➔ Stateless
➔ Hypermedia
➔ Formato de API padrão utilizado pelo API Platform
Documentação
➔ Baseada na especificação do OpenAPI
➔ Utiliza as ferramentas Swagger e ReDoc
➔ Possui template Configurável
➔ Compatível com a camada de API Gateway da AWS
➔ Por padrão vem com o Swagger UI habilitado
API GraphQL
➔ Query Language para API criada pelo Facebook em 2012;
➔ Fortemente tipada;
➔ Retorna apenas os dados requisitados pelo cliente;
➔ Retorna vários recursos em um único request;
➔ Baseado em 3 tipos de requisições (root types):
◆ query;
◆ mutation;
◆ subscription;
➔ docker-compose exec php composer req webonyx/graphql-
php && bin/console cache:clear
/**
* @ApiResource(
* attributes={
* "filters"={"people.search_filter"}
* },
* graphql={
* "query"={
* "filters"={"people.date_filter"}
* },
* "delete",
* "update",
* "create"
* }
* )
*/
class Offer
{
// ...
}
Documentação
➔ Documentação interativa com o GraphiQL
➔ IDE no browser com várias funcionalidades como:
◆ Possibilidade de testar as querys e mutations;
◆ Prettify;
◆ Histórico;
◆ Documentação com filtro para buscas;
◆ Autocomplete;
The Admin Component
├── Dockerfile
├── node_modules
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ └── manifest.json
├── README.md
├── src
│ ├── App.js
│ ├── App.test.js
│ ├── index.js
│ └──
serviceWorker.js
└── yarn.lock
O API Platform Admin é um componente para suporte a criação de conteúdos da API.
➔ Possui um layout baseado em Material Design;
➔ Baseado em React;
➔ SPA sem acoplamento com o Back-end;
➔ Totalmente customizável;
➔ Gerador de CRUD para todas as resources presentes na API;
➔ Gerador de código baseado na API Doc ou no Schema.org;
➔ Suporte à paginação e autenticação;
➔ Exibição de erros amigáveis;
The Client Component
├── Dockerfile
├── node_modules
├── package.json
├── public
│ ├── favicon.ico
│ ├── index.html
│ └── manifest.json
├── README.md
├── src
│ ├── config
│ ├── index.js
│ ├──
serviceWorker.js
│ ├── welcome.css
│ └── Welcome.js
└── yarn.lock
The Client Component
O Client Generator é o caminho mais rápido para criação de webapps e apps mobile
➔ Suporta o formato de dados Hydra;
➔ Suporta React, React Native, Vue.js e Angular;
➔ Integração com Bootstrap e Font Awesome;
➔ Utiliza conceitos do ES6;
➔ Utilização de input types apropriados;
➔ Suporte a atualizações utilizando o protocolo Mercure;
➔ Suporte à pessoas com deficiência (ARIA);
Conclusão
➔ API Platform é um conjunto com as principais tendências em ferramentas no
mercado para construção de API’s de uma forma mais fácil e rápida
➔ Possui uma filosofia de não prender o desenvolvedor em estruturas já criadas,
grandes possibilidades de customização para se adequar às especificações dos
projetos
➔ Possui uma filosofia de melhorar a forma de como se desenvolve API’s
oferecendo as melhores práticas
Agradecimentos
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Platform

Mais conteúdo relacionado

Mais procurados

FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014Alan Glei
 
Apresentação da Linguagem de Programação PHP
Apresentação da Linguagem de Programação PHPApresentação da Linguagem de Programação PHP
Apresentação da Linguagem de Programação PHPLorranna Machado
 
Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Fernando Gonçalves
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Eric Gallardo
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoLuiz Junior
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Eliel Simoncelo
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETJosé Corrêa Viana
 
CakePHP + Adobe Flex®, v2
CakePHP + Adobe Flex®, v2CakePHP + Adobe Flex®, v2
CakePHP + Adobe Flex®, v2Cauan Cabral
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPArlindo Santos
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Carl Edwin
 
WCPOA2019 - WordPress como um backend de seus aplicativos
WCPOA2019  - WordPress como um backend de seus aplicativosWCPOA2019  - WordPress como um backend de seus aplicativos
WCPOA2019 - WordPress como um backend de seus aplicativosJackson F. de A. Mafra
 

Mais procurados (20)

EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGOEVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
EVOLUÇÃO DA LINGUAGEM DELPHI - ARTIGO
 
FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014FireDAC: do básico ao avançado - Embarcadero Conference 2014
FireDAC: do básico ao avançado - Embarcadero Conference 2014
 
Apresentação da Linguagem de Programação PHP
Apresentação da Linguagem de Programação PHPApresentação da Linguagem de Programação PHP
Apresentação da Linguagem de Programação PHP
 
A Linguagem Php
A Linguagem PhpA Linguagem Php
A Linguagem Php
 
Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)Desenvolvendo para web ASP.Net (Overview para iniciantes)
Desenvolvendo para web ASP.Net (Overview para iniciantes)
 
Treinamento ASP.NET 2014
Treinamento ASP.NET 2014Treinamento ASP.NET 2014
Treinamento ASP.NET 2014
 
Curso de PHP Básico ao Avançado
Curso de PHP Básico ao AvançadoCurso de PHP Básico ao Avançado
Curso de PHP Básico ao Avançado
 
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
Mercurianos - .Net na Prática - Da instalação até o debug da nossa API em um ...
 
Apostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NETApostila - Desenvolvimento Web com ASP.NET
Apostila - Desenvolvimento Web com ASP.NET
 
Introdução ao PHP5
Introdução ao PHP5Introdução ao PHP5
Introdução ao PHP5
 
CakePHP + Adobe Flex®, v2
CakePHP + Adobe Flex®, v2CakePHP + Adobe Flex®, v2
CakePHP + Adobe Flex®, v2
 
Docker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no AzureDocker com ASP.NET Core e Hospedagem no Azure
Docker com ASP.NET Core e Hospedagem no Azure
 
PHP + Flex
PHP + FlexPHP + Flex
PHP + Flex
 
Cakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHPCakephp - framework de desenvolvimento de aplicações Web em PHP
Cakephp - framework de desenvolvimento de aplicações Web em PHP
 
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
Monografia restful -_2013_-_desenvolvimento_v17-final-2014[1]
 
Palestra Sobre REST
Palestra Sobre RESTPalestra Sobre REST
Palestra Sobre REST
 
WCPOA2019 - WordPress como um backend de seus aplicativos
WCPOA2019  - WordPress como um backend de seus aplicativosWCPOA2019  - WordPress como um backend de seus aplicativos
WCPOA2019 - WordPress como um backend de seus aplicativos
 
ASP.NET - Conceitos Básicos
ASP.NET - Conceitos BásicosASP.NET - Conceitos Básicos
ASP.NET - Conceitos Básicos
 
Aula Ruby
Aula RubyAula Ruby
Aula Ruby
 
Curso asp - basico
Curso   asp - basicoCurso   asp - basico
Curso asp - basico
 

Semelhante a Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Platform

Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de CakephpCauan Cabral
 
Fundamentos do asp.net
Fundamentos do asp.netFundamentos do asp.net
Fundamentos do asp.netleojr_0
 
Laszlo, Framework focado em MVC
Laszlo, Framework focado em MVCLaszlo, Framework focado em MVC
Laszlo, Framework focado em MVCraquelcarsi
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Flávio Lisboa
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkJaime Neto
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...Renato Groffe
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHPAdler Medrado
 
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Ramon Durães
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPelliando dias
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicRicardo Guerra Freitas
 
Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Renato Groff
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento webRodrigo Rodrigues
 

Semelhante a Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Platform (20)

Cake Php
Cake PhpCake Php
Cake Php
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de Cakephp
 
Fundamentos do asp.net
Fundamentos do asp.netFundamentos do asp.net
Fundamentos do asp.net
 
Laszlo, Framework focado em MVC
Laszlo, Framework focado em MVCLaszlo, Framework focado em MVC
Laszlo, Framework focado em MVC
 
Python 08
Python 08Python 08
Python 08
 
Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011Palestra Zend Framework na Campus Party 2011
Palestra Zend Framework na Campus Party 2011
 
Performance de verdade com Phalcon Framework
Performance de verdade com Phalcon FrameworkPerformance de verdade com Phalcon Framework
Performance de verdade com Phalcon Framework
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
PHP 10 CodeIgniter
PHP 10 CodeIgniterPHP 10 CodeIgniter
PHP 10 CodeIgniter
 
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
 
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
Introdução ao ASP.NET 3.5 - Campus Party Brasil 2009
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Desenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHPDesenvolvimento Web Avançado usando PHP
Desenvolvimento Web Avançado usando PHP
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual Basic
 
Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018Docker para Desenvolvedores - Developers-BR - Agosto-2018
Docker para Desenvolvedores - Developers-BR - Agosto-2018
 
Introdução sobre desenvolvimento web
Introdução sobre desenvolvimento webIntrodução sobre desenvolvimento web
Introdução sobre desenvolvimento web
 

Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Platform

  • 2. Hello! Eu sou Bruno Souza! ➔ Analista de Sistemas - MRE pela empresa Datainfo ➔ Graduado em Análise e Desenvolvimento de Sistemas - UNIP ➔ Pós-graduando em Big Data e Ciência de Dados - PUC Minas ➔ ZCPE ➔ Microsoft Specialist - HTML5, CSS e JS @Bruno_HSouza brunohsouza
  • 3. A utilização de APIs traz algumas vantagens como: ➔ Grande oportunidade de negócios para empresas; ➔ Novos fluxos de receita ➔ Maximização de valores para os clientes e negócio ➔ Expansão de mercado ➔ Ponto central de processamento e acesso aos dados ➔ Encapsulamento da lógica de negócios ➔ Disponibilização das funcionalidades em diversos dispositivos
  • 4. A ascensão do uso de API’s em uma abordagem técnica se torna um desafio, pois a arquitetura deve ser: ➔ Sólida; ➔ Segura; ➔ Performática; ➔ Flexível; ➔ Auto-escalável; ➔ Resiliente; ➔ Altamente disponível
  • 5.
  • 6. O que é o API Platform? Um conjunto de ferramentas para facilitar a criação e o consumo de Web API’s. Segundo o conceito de plataforma em TI, pode ser definido como: um grupo de tecnologias que são usadas como base sobre a qual outras aplicações, processos ou tecnologias são desenvolvidas.
  • 7. O que é o API Platform? Visa oferecer um conjunto de ferramentas e padrões para facilitar a construção de sistemas baseados em API.
  • 8. “ API Platform is the most advanced API platform, in any framework or language. Fabien Potencier
  • 9. ➔ Desenvolvido por Kévin Dunglas ➔ Possui 4.172 estrelas no Git Hub [17 de maio de 2019 ] ➔ 437 Forks no Git Hub [17 de maio de 2019] ➔ Versão 2.4.2 [17 de maio de 2019]
  • 11. A forma recomendada para a instalação do API Platform e utilização de uma forma mais rápida é via docker-compose. Para isto, basta: 1. Baixar uma versão de sua distribuição oficial ou via git clone pelo github; 2. Instalar o Docker (caso já não tenha feito); 3. Abrir o terminal onde está o skeleton do projeto; 4. Executar os comandos: a. docker-compose pull - para baixar a última versão da imagem b. docker-compose up -d - para executar em background ou docker- compose up para executar em primeira tela, permitindo visualizar os logs de acesso e erro referentes aos containers;
  • 13.
  • 14. Distribuição dos containers Nome Descrição Porta(s) php Onde fica a API e o seu código-fonte, composer e configs 9000 | n/a db Um servidor de banco de dados com o PostgresSQL 5432 client Um servidor de desenvolvimento para a camada front-end (PWA, SPA) 80 admin Um servidor de desenvolvimento para gerenciamento do conteúdo do site 81 cache-proxy Um servidor HTTP de cache proxy baseado em Varnish 8081 mercure Servidor dedicado para execução do protocolo Mercure 443 h2-proxy Um servidor HTTPS e HTTP/2 com proxy para todos os apps 443 (client) 444 (admin) 8443 (api) 8444 (cache-proxy)
  • 15. Isto é demais para você ou o seu projeto?
  • 17. Você pode fazer a instalação via Composer, utilizando a estrutura do Symfony Flex e a recipe para o API Platform. Para isto, basta executar os seguintes passos: ➔ Execute: composer create-project symfony/skeleton my-api ➔ Entre no diretório de instalação e execute o comando: composer req api ➔ Para executar a API com o WebServerBundle: composer req server-dev ➔ Para visualização do site execute: bin/console server:run ➔ Acesse o localhost do server, geralmente http://127.0.0.1:8000; ➔ Para acessar a interface de documentação da API, acesse: http://127.0.0.1:8000/api
  • 19. Distribuído em alguns componentes principais: ➔ The API Component; ➔ The Admin Component; ➔ The Client Component; ➔ The Schema Generator Component;
  • 21. O Schema Generator Component é uma ferramenta executada via linha de comando no terminal (CLI) para facilitar e gerar modelos de dados instantâneos a partir do vocabulário do site Schema.org;
  • 22. O Schema.org é uma comunidade colaborativa fundada por membros do Google, Microsoft, Yahoo e Yandex com a missão de criar, manter e promover schemas para estruturas de dados na internet. Possui um vocabulário que pode ser utilizado em diversos formatos. Este vocabulário é facilmente estendido e abordam entidades, relacionamentos e actions.
  • 23. Conjunto de vocábulos ou palavras representadas em uma determinada língua Vocabulário
  • 24.
  • 25. Para utilizar o Schema Generator basta executar o comando no terminal: docker-compose exec php vendor/bin/schema Caso não esteja utilizando o API Platform com o docker é possível instalar o componente via Composer executando o comando: composer require --dev api-platform/schema-generator
  • 26. Para executar o Schema Generator: ➔ acesse o site Schema.org, escolha os types e properties dos dados necessários para a sua aplicação; ➔ Com os dados escolhidos, crie um arquivo chamado schema.yaml dentro do diretório config da sua API e preencha conforme o modelo dos dados do Schema.org; ➔ Execute o comando para gerar os modelos: vendor/bin/schema generate-types src config/schema.yaml
  • 27. types: # Parent class of Person Thing: properties: name: ~ Person: properties: familyName: ~ givenName: ~ additionalName: ~ address: ~ PostalAddress: # Disable the generation of the class hierarchy for this type parent: false properties: # Force the type of the addressCountry property to text addressCountry: { range: "Text" } addressLocality: ~ addressRegion: ~ postOfficeBoxNumber: ~ postalCode: ~ streetAddress: ~
  • 28.
  • 30. ├── bin ├── config │ ├── packages │ └── routes ├── docker │ ├── nginx │ ├── php │ └── varnish ├── helm │ └── api ├── public │ └── bundles ├── src │ ├── Controller │ ├── Entity │ └── Repository ├── templates └── var
  • 31. Considerações ➔ Code First ➔ Design First ➔ @ApiResource annotation ➔ Data Persisters ➔ Data Providers ◆ CollectionDataProviderInterface ◆ ItemDataProviderInterface ➔ Padrões (CQS, CQRS, REST, GRAPHQL, Event Sourcing)
  • 33. Método Obrigatório Descrição GET SIM Recupera uma lista de elementos (paginados) POST NÃO Cria um novo elemento Método Obrigatório Descrição GET SIM Recupera um elemento PUT NÃO Altera um elemento DELETE NÃO Deleta um elemento Collection Item
  • 35. ➔ É possível habilitar ou desabilitar operações da seguinte forma: /** * A person (alive, dead, undead, or fictional). * @see http://schema.org/Person Documentation on Schema.org * @ORMEntity * @ApiResource(iri="http://schema.org/Person" * @collectionOperations={"create”={"method"="POST"}}, * @itemOperations={"find"={"method"="GET"}}, * ) */ class Person { ... }
  • 37. /** * A person (alive, dead, undead, or fictional). * @see http://schema.org/Person Documentation on Schema.org * @ORMEntity * @ApiResource(iri="http://schema.org/Person" * @collectionOperations={"create”={"method"="POST"}}, * @itemOperations={"find"={"method"="GET", path=”/person/{id}”, “requirements”={“id”=”d+”}, “defaults”={“color”=”brown”}, “options”={“my- option”=”my-option-value”}, “schemes”={“https”}, “host”=”{subdomain}.api- platform.com”, “put”=”method”=”PUT”, “path”=”/person/{id}”, “hydra_context”={“foo”=”bar”} }, * ) */ class Person
  • 39. /** * @ORMEntity * @ApiResource(iri="http://schema.org/Person" * subresourceOperations={ * “get_address_subresource”= { * “method=”GET”, “path”=”/person/{id}/all-address” * } * }, * ) */ class Person { /** * @var PostalAddress|null physical address of the item * @ORMManyToOne(targetEntity="AppEntityPostalAddress") * @ApiProperty(iri="http://schema.org/address") * @ApiSubresource(maxDepth=1) */ private $address;
  • 40. { "person": { "@id": "/people/1", "@type": "Person", "additionalName": "Iron Man", "address": { "home": [{ ... }, "work": [{ "city": "New York", "zipCode": "11445", "country": "United States", "coordinates": [{ "latitude": "-73.935242", "longitude": "40.730610" }] }] }] }, "familyName": "Stark", "givenName": "Tony", "id": 1 } }
  • 42. Suporta alguns formatos de dados como: ○ json-ld {application/ld+json} ○ json {application/json} ○ json-hal {application/hal+json} ○ json-api {application/vnd.api+json} ○ csv {text/csv} ○ yaml {application/x-yaml} ○ xml {application/xml} ○ html {text/html} ○ my-format {application/vnd.my-format}
  • 44. Json-LD - Json for Linked Data ➔ É um formato de serialização utilizado na comunicação entre aplicações cliente e servidor; ➔ Baseado na RFC4627 ➔ Padronizado pela W3C recommandation (2014) para formatos de hypemedia; ➔ Fácil de usar: JSON em formato padrão, mas com algumas chaves especiais (@) e mapeadas por contexto; ➔ Apoiado por empresas como: Google, BBC, Microsoft e órgãos governamentais de alguns países (EUA e Europa); ➔ Compatível com tecnologias de web semântica: RDF, SPARQL, etc.
  • 45. Json-LD Oferece ➔ Maior interoperabilidade entre os dados ➔ Mecanismo de identificação universal através de IRI’s (Internationalized Resource Identifier) ➔ Forma de distinguir chaves compartilhadas por meio de mapeamentos através IRI’s e contexts ➔ Mecanismo de referências entre objetos JSON ➔ Associação de tipos de dados ➔ Facilidade de expressar gráficos direcionados em um único documento
  • 46. Json-LD (Objetivos) ➔ Simplicidade ➔ Compatibilidade ➔ Intensidade ➔ Internacionalização (@language) ➔ Expressividade
  • 47. Linked Data Principles ➔ Usar as URI’s para nomear as coisas ➔ Use URIs HTTP para que as pessoas possam procurar o desejado ➔ Quando alguém pesquisar por URI’s, forneça informações úteis ➔ Inclua links para outras URI’s para que eles possam descobrir mais dados Tim Berners Lee
  • 48. { "@context": "https://json-ld.org/contexts/person.jsonld": { “@language”: "en-US" }, "@id": "http://dbpedia.org/resource/Tony_Stark", "name": "Tony Stark", "born": "1940-10-09", "spouse": "http://dbpedia.org/resource/Pepper_Potts" }
  • 49. Hydra
  • 50. 54
  • 51. ➔ É um padrão que permite uma construção mais amigável e interoperável de API’s; ➔ Sua fundação é baseada no Hydra Core Vocabulary (http://www.hydra- cg.com/spec/latest/core/); ➔ Define alguns conceitos e fundamentos que permitem clientes entenderem como interagir com API’s, uma vez que as informações estão disponíveis em um formato genérico; ➔ Disponibiliza uma descoberta de entrypoints automaticamente se os cabeçalhos das responses da API estiverem no formato estipulados pela RFC5988; ➔ Permite que os dados sejam lidos por humanos e máquinas através de markups;
  • 52. { "@context": "http://www.w3.org/ns/hydra/context.jsonld", "@id": "http://api.example.com/doc/", "@type": "ApiDocumentation", "title": "The name of the API", "description": "A short description of the API", "entrypoint": "URL of the API's main entry point", "supportedClass": [ ... Classes known to be supported by the Web API ... ], "possibleStatus": [ ... Statuses that should be expected and handled properly ... ] }
  • 54. ➔ JSON Web Token (JWT) Authentication ➔ composer req lexik/jwt-authentication-bundle ➔ Requer configuração necessária ➔ Utiliza o Symfony Security Component ➔ Suporte ao OAuth ➔ Segue as orientações da OWASP (Open Web Application Security Project)
  • 55. /** * Secured resource. * * @ApiResource( * attributes={"access_control"="is_granted('ROLE_USER')"}, * collectionOperations={ * "get", * "post"={"access_control"="is_granted('ROLE_ADMIN')"} * }, * itemOperations={ * "get"={"access_control"="is_granted('ROLE_USER') and object.owner == user"} * } * ) * @ORMEntity */ class Person
  • 57. /** * @ApiResource( * messenger=true, * collectionOperations={ * "post"={"status"=202} * }, * itemOperations={}, * output=false * ) */ final class ResetPasswordRequest
  • 60. Com base no Symfony Framework, possui várias funcionalidades como: ➔ Pagination ➔ Filters ➔ Ordenação ➔ Validates ➔ Serializer ➔ Router ➔ Tratamento de erros ➔ Cache ➔ Events ➔ Messenger ➔ Suporte aos Bundles do FOS ➔ Suporte à GraphQL ➔ Segurança ➔ Data Providers; ➔ Data Persisters; ➔ HTTPKernel ➔ HTTP/2
  • 62. Oferece suporte à outras funcionalidades, como: ➔ Autenticação com JSON Web Token (JWT); ➔ Autenticação com o OAuth utilizando FosOAuthServer; ➔ Envios de e-mails com Swift Mailer; ➔ Integração com RabbitMQ; ➔ Integração com o MongoDB; ➔ Integração com o Elastic Search; ➔ Integração e utilização do protocolo Mercure;
  • 64. ➔ Qualquer Symfony Controller válida ➔ Recomenda-se utilizar o event system quando aplicável ➔ Utiliza o padrão ADR (Action-Domain-Responder) Action Domain Responder
  • 66. ➔ Criado em 2000 por Roy Fielding em uma tese de mestrado ➔ Recursos com identificação única (URI); ➔ Uma funcionalidade por verbo HTTP; ➔ Utiliza uma interface única para requisições; ➔ Utiliza JSON como formato padrão; ➔ Stateless ➔ Hypermedia ➔ Formato de API padrão utilizado pelo API Platform
  • 68. ➔ Baseada na especificação do OpenAPI ➔ Utiliza as ferramentas Swagger e ReDoc ➔ Possui template Configurável ➔ Compatível com a camada de API Gateway da AWS ➔ Por padrão vem com o Swagger UI habilitado
  • 69.
  • 71. ➔ Query Language para API criada pelo Facebook em 2012; ➔ Fortemente tipada; ➔ Retorna apenas os dados requisitados pelo cliente; ➔ Retorna vários recursos em um único request; ➔ Baseado em 3 tipos de requisições (root types): ◆ query; ◆ mutation; ◆ subscription; ➔ docker-compose exec php composer req webonyx/graphql- php && bin/console cache:clear
  • 72.
  • 73. /** * @ApiResource( * attributes={ * "filters"={"people.search_filter"} * }, * graphql={ * "query"={ * "filters"={"people.date_filter"} * }, * "delete", * "update", * "create" * } * ) */ class Offer { // ... }
  • 75. ➔ Documentação interativa com o GraphiQL ➔ IDE no browser com várias funcionalidades como: ◆ Possibilidade de testar as querys e mutations; ◆ Prettify; ◆ Histórico; ◆ Documentação com filtro para buscas; ◆ Autocomplete;
  • 76.
  • 78. ├── Dockerfile ├── node_modules ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── README.md ├── src │ ├── App.js │ ├── App.test.js │ ├── index.js │ └── serviceWorker.js └── yarn.lock
  • 79. O API Platform Admin é um componente para suporte a criação de conteúdos da API. ➔ Possui um layout baseado em Material Design; ➔ Baseado em React; ➔ SPA sem acoplamento com o Back-end; ➔ Totalmente customizável; ➔ Gerador de CRUD para todas as resources presentes na API; ➔ Gerador de código baseado na API Doc ou no Schema.org; ➔ Suporte à paginação e autenticação; ➔ Exibição de erros amigáveis;
  • 80.
  • 82. ├── Dockerfile ├── node_modules ├── package.json ├── public │ ├── favicon.ico │ ├── index.html │ └── manifest.json ├── README.md ├── src │ ├── config │ ├── index.js │ ├── serviceWorker.js │ ├── welcome.css │ └── Welcome.js └── yarn.lock
  • 83. The Client Component O Client Generator é o caminho mais rápido para criação de webapps e apps mobile ➔ Suporta o formato de dados Hydra; ➔ Suporta React, React Native, Vue.js e Angular; ➔ Integração com Bootstrap e Font Awesome; ➔ Utiliza conceitos do ES6; ➔ Utilização de input types apropriados; ➔ Suporte a atualizações utilizando o protocolo Mercure; ➔ Suporte à pessoas com deficiência (ARIA);
  • 85. ➔ API Platform é um conjunto com as principais tendências em ferramentas no mercado para construção de API’s de uma forma mais fácil e rápida ➔ Possui uma filosofia de não prender o desenvolvedor em estruturas já criadas, grandes possibilidades de customização para se adequar às especificações dos projetos ➔ Possui uma filosofia de melhorar a forma de como se desenvolve API’s oferecendo as melhores práticas

Notas do Editor

  1. Baixar uma versão de sua .distribuição oficial que está em formato .tar.gz ou via git clone pelo github; Instalar o Docker (caso já não tenha feito); Abrir o terminal onde está o skeleton do projeto; Executar os comandos: docker-compose pull - para baixar a última versão da imagem docker-compose up -d - para executar em background ou docker-compose up para executar em primeira tela, permitindo visualizar os logs de acesso e erro referentes ao container;
  2. Gera Entidades a partir do vocabulário do site Schema.org
  3. O Schema.Org é um vocabulário, criado para tentar unificar e padronizar dados.
  4. As classes geradas pelo schema generator são implementas utilizando: os padrões das PSR’s. Auto-documentação com o PHPDoc; Mapeamentos das classes utilizando as annotations do Doctrine; Validação de dados com o Symfony Validator; Namespace customizáveis; Pode ser utilizado em outros frameworks;
  5. Repare que após o comando generate-types, indicamos a pasta onde estão as entidades da API e consequentemente, onde ficarão as models geradas pelo schema. Indicamos também o caminho do arquivo schema.yaml para que o gerador possa fazer a leitura e interpretação de forma correta das models. Após o procedimento para gerar as models é possível perceber as novas classes de Entidades geradas na estrutura da API. Repare que as classes foram geradas seguindo os padrões das PSR’s, com os comentários e annotations no padrão do Doctrine incluindo o mapeamento das propriedades, com as funções getters e setters, constantes geradas de forma correta. É possível customizar os namespaces das models e utilizar as validações do Symfony Validator. É possível também utilizar este componente com outros frameworks PHP além do Symfony. Vantagens de se usar o schema generator e Schema.org: Não reinventar a roda; Os modelos de dados gerados pelo Schema.org são populares e já provaram serem eficientes; Melhorar o SEO e a UX; Adicionando os markups do Schema.org, as apps são melhores rankiadas em mecanismos de buscas e habilita algumas funcionalidades como o Google Rich Snippets e Gmail markup Estar pronto para o futuro; Melhora os dados para adequação da leitura de máquina, facilitando o acesso e extração de dados da API;
  6. Code First: Baseada nas regras de negócio, a API é codificada diretamente de uma documentação legível; Design First: As regras de negócio são convertidas para um contrato legível por humanos ou máquinas, o qual o código é implementado @ApiResource: tag de marcação para identificação de um objeto PHP que representa um endpoint suas entradas e saídas. Esta classe não precisa estar mapeada com o Doctrine, porém se estiver, traz muitas facilidades para a persistência e gerenciamento dos dados. Persisters: Para realizar as mutações dos dados, o API Platform utiliza os Data Persisters, os quais recebem uma instância da classe mapeada com a tag @ApiResource juntamente com os dados submetidos pelo cliente. Data Providers é um componente para comunicação com as camadas de persistência, podendo ser um RDBM ou NoSQL, ElasticSearch, etc.
  7. Esta tabela mostra as operações disponibilizadas automaticamente quando a annotation @ApiResource é habilitada. Por padrão o JSON API também permite o uso do método PATCH para atualização de dados;
  8. CollectionsOperation - defina operações para as coleções de dados ItemOperations - define operações para os itens , Requirements Defaults Options Schemes, Paths, Hydra contexts
  9. Desde a versão 2.1, o API Platform disponibiliza a opção de criar subresources. Apenas para operações com GET. Uma subresource é uma entidade que depende ou pertence de outra resource. É possível definir o caminho (path) da subresource Max Depth
  10. Por padrão, o API Platform vem com o JSON-LD habilitado como formato padrão. Porém, vários formatos de dados são suportados. O APi Platform detecta o melhor formato dos dados automaticamente baseado em: Os formatos habilitados O formato da requisição, baseado no campo Accept, HTTP Header ou uma extensão adicionada à URL É possível habilitar um formato próprio customizado bastando registrar um encoder.
  11. A chave data deve ser: Os campos data e error não devem coexistir em um mesmo documento; Single Resources -> resource object, resource identifier object ou null; Collections -> array of resource objects, array of resource identifier object, array vazio []; Toda Resource deve conter o campos id e type. Estes campos devem ser strings;
  12. Resources Objects devem conter no mínimo os atributos id e type, a menos que o cliente esteja gerando uma nova resource onde o id não é requerido. Alguns outros atributos que uam resource pode ter: attributes - contém um objeto que possui atributos representando alguns dados de resources; Relationships - contém objeto com dados descrevendo os relacionamentos entre resources; Links - contém objeto com links relacionados à resources; Meta - contém um objeto com metadados não padronizados sobre resources os quais não podem ser representados por atributos ou relacionamentos
  13. Ferramenta de análise de estrutura de dados do Google: Os desenvolvedores precisam aprender basicamente as duas keywords principais @context e @id @context - Usado para definir os atalhos em um documento JSON. Estes atalhos são chamados de termos e ajuda os desenvolvedores a expressar identificadores específicos de uma maneira compacta; @id - Usado unicamente para identificar coisas que são escritas como IRIs ou identificadores de nós vazios; https://search.google.com/structured-data/testing-tool?utm_campaign=devsite&utm_medium=jsonld&utm_source=intro-structured-data
  14. Tem o objetivo de trazer: Uma maior interoperabilidade para os Web services; Um mecanismo de identificação universal para objetos JSON através do uso de IRIs (Internationalized Resource Identifier); Uma forma de distinguir chaves compartilhadas entre diferentes documentos de objetos JSON por meio de mapeamentos através de IRIs e contexts; Um mecanismo onde um objeto JSON em um site pode referenciar à outro objeto JSON de um site diferente; A habilidade de anotações de strings em sua própria linguagem; Uma forma de associar tipos de dados com valores como data e hora; Uma facilidade de expressar um ou mais gráficos direcionados em um único documento, como em uma rede social;
  15. Simplicidade Não requer libs externas ou processamentos extra para sua utilização em sua forma mais básica Compatibilidade Um documento JSON-LD é sempre um objeto JSON válido. Isto assegura que os padrões JSON funcionem em um documento JSON-LD. Intensidade Torna a leitura humana mais fácil, requer o mínimo esforço possível do desenvolvedor; Internacionalização Através da tag @language permite definir o idioma do contexto de dados; Expressividade A sintaxe de grafos serializados permite que qualquer objeto no mundo real possa ser expressado
  16. Faz a descrição do json auto descritivo Ferramenta de análise de estrutura de dados do Google: https://search.google.com/structured-data/testing-tool?utm_campaign=devsite&utm_medium=jsonld&utm_source=intro-structured-data
  17. A navegação pela internet está toda palpada em como trabalhar e definir hyperlinks. Sem os hyperlinks seria impossível navegar pela internet. Usuários tipicamente clicam em links etiquetados que representam os seus interesses. O problema é que as máquinas não reconhecem estes hyperlinks. Para das as máquinas um entendimento similar, os links podem ser criados com um relation type (um token registrado ou uma URI identificando a semântica dos links). A Hydra foi criada para facilitar a identificação de links diferenciáveis por máquinas.
  18. É um padrão que permite uma construção mais amigável e interoperável de API’s; Sua fundação é baseada no Hydra Core Vocabulary (http://www.hydra-cg.com/spec/latest/core/); Define alguns conceitos e fundamentos que permitem clientes entenderem como interagir com API’s, uma vez que as informações estão disponíveis em um formato genérico; Disponibiliza uma descoberta de entrypoints automaticamente se os cabeçalhos das responses da API estiverem no formato estipulados pela RFC5988; Permite que os dados sejam lidos por humanos e máquinas através de markups;
  19. http://www.markus-lanthaler.com/hydra/
  20. O JSON Web Token é um padrão baseado em JSON o qual tem o objetivo de controlar o acesso do usuário baseado no token tramitado entre as requisições.
  21. O JSON Web Token é um padrão baseado em JSON o qual tem o objetivo de controlar o acesso do usuário baseado no token tramitado entre as requisições.
  22. Action Domain Responder tem por objetivo organizar as uma interface única de interação entre o cliente e o servidor em 3 papéis distintos. Action é a lógica para conectar o Domain ao Responder. Ele invoca o Domain com os dados do Request, depois invoca o Responder com os dados necessários para se criar o objeto Response. Domain é o entrypoint do domínio, formando a camada lógica da aplicação Responder é a representação lógica para se criar o objeto Response The web handler receives an HTTP request and dispatches it to an Action. The Action invokes the Domain, collecting any required inputs to the Domain from the HTTP request. The Action then invokes the Responder with the data it needs to build an HTTP response (typically the HTTP request and the Domain results, if any). The Responder builds an HTTP response using the data fed to it by the Action. The Action returns the HTTP response to the web handler sends the HTTP response.
  23. Representational State Transfer (REST) Sintaxe universal para identificar os recursos por meio das URI’s; Conjunto de operações bem definidas que se aplicam a todos os resources. HTTP methods Stateless = Protocolo cliente/servidor sem estado. Cada mensagem contém toda informação necessária para compreender o pedido