SlideShare ist ein Scribd-Unternehmen logo
1 von 40
Downloaden Sie, um offline zu lesen
Criando APIs
usando o micro-framework
Respect
Ivan Rosolen
Graduado em Sistemas de Informação
Pós-graduado em Gerência de Projetos
Desenvolvedor a 14+ anos
Autor de vários PHPT (testes para o PHP)
Entusiasta de novas tecnologias
Head of Innovation @ Arizona
CTO @ Mokation
@ivanrosolen
API
Vantagens
- Troca de informações entre sistemas
- Múltiplas interfaces (web, mobile, CLI)
- Módulos/Componentes
- HTTP Status Codes
- Controle de Acesso
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
REST BEER
API com informações de Ceveja!
GET - http://hostname/cerveja/
POST - http://hostname/cerveja/
cerveja[nome]
cerveja[estilo]
PUT - http://hostname/cerveja/NOME
cerveja[nome]
cerveja[estilo]
DELETE - http://hostname/cerveja/NOME
RESPECT
Micro-framework para PHP 5.3+
construido por Alexandre Gaigalas
(alganet) e comunidade.
Como?
Composer
- Controle de dependências
curl -s http://getcomposer.org/installer | php
php composer.phar install
https://getcomposer.org
{
"name": "RestBeer Jelastic Demo",
"authors": [
{
"name": "Ivan Rosolen",
"email": "ivanrosolen@gmail.net"
}
],
"require": {
"respect/rest": "0.5.x",
"respect/relational": "0.5.x",
"respect/config": "0.3.x",
"respect/validation": "0.4.x"
}
}
Respect/Config
- Apenas arquivos .INI
- Usa o mesmo parser nativo e rápido do php.ini
- Extende o arquivo .INI com seu próprio “dialeto”
- Implementa lazy loading para instâncias de objeto
https://github.com/Respect/Config
db_server = "127.0.0.1"
db_name = "restbeer"
db_user = "user"
db_pwd = "pwd"
dsn_mysql = "mysql:host=[db_server];dbname=[db_name]"
<?php
use RespectConfigContainer;
// Ler arquivo de configuração
$config = new Container('config.ini');
echo $config->dsn_mysql; // mysql:host=127.0.0.1;dbname=restbeer
Respect/Relational
- Quase zero de configuracão (convenção)
- Fluent interface: $mapper->author[7]->fetch();
- Diferentes tipos de banco de dados
- Registros são tratados como Plain Data Object
https://github.com/Respect/Relational
<?php
use RespectRelationalMapper;
// criar instância PDO com o banco
$mapper = new Mapper(new PDO('seudsn'));
// buscar todos os autores
$authors = $mapper->author->fetchAll();
// criar objeto de um registro
$obj = new stdClass;
$obj->name = 'Ivan Rosolen';
// "gravar" informação no banco
$mapper->author->persist($obj);
$mapper->flush();
Respect/Validation
- Fluent/Chained interface: v::numeric()->positive()->between(1,
256)->validate($num)
- 100+ validadores testados
- Fácil extender ou criar novas regras (Concrete API)
- Php 7 ( Quase pronto )
https://github.com/Respect/Validation
use RespectValidationValidator as v;
// validar número simples
v::numeric()->validate(42); //true
// validar em cadeia
$v = v::arr() // validar se é array
->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace()) // validar a key 'nome'
->key('estilo', $rule) // utilizando a mesma regra da key de cima
->validate($_POST['cerveja']);
// negação de qualquer regra
$v = v::not(v::int())->validate(10); // false
// operadores lógicos
v::allOf(v::numeric(), v::hexa(), v::min(1)); // numeric, hexadecimal e pelo menos 1
v::oneOf(v::nullValue(), v::numeric()); // null ou numeric
Respect/Router
- Thin and lightweight controller para aplicações
RESTful e APIs
- “Don't try to change PHP, small learning curve.”
- If/Before/After/Accept/Auth/Any/By …
https://github.com/Respect/Rest
<?php
use RespectRestRouter;
// Criar instância do router
$router = new Router; // raiz http://example.com/
// instância para trabalhar em uma subpasta
$router = new Router('/pasta'); // raiz http://example.com/pasta
// Olá mundo
$router->get('/', function() {
return 'Hello World';
});
// Separando regras das rotas :D
$router->get('/api/uri/*/*', 'NamespaceCoolClass');
$router->post('/api/uri/', 'NamespaceCoolClass');
$router->put('/api/uri/', 'NamespaceCoolClass');
$router->delete('/api/uri/*', 'NamespaceCoolClass');
Projeto
<?php
require_once realpath(__DIR__ . '/vendor/autoload.php');
use RespectRestRouter;
use RespectConfigContainer;
use RespectValidationValidator as v;
use RespectRelationalMapper;
//Ler arquivo de configuração
$config = new Container('config.ini');
// Criar instância PDO com o SQLite usando as configs
$mapper = new Mapper(new PDO($config->dsn_sqlite));
// Criar instância do router
$router = new Router();
//Rota para qualquer tipo de request (any)
$router->any('/', function () {
return 'RestBeer!';
});
GET Cerveja
$router->get('/cerveja/*', function ($data = null) use ($mapper) {
if ( !isset($data) ) {
$cervejas = $mapper->cervejas->fetchAll();
header('HTTP/1.1 200 Ok');
return $cervejas;
}
$data = filter_var( $data, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( v::not(v::alnum()->notEmpty())->validate($data) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = $mapper->cervejas(array( 'nome' => $data ))->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 204 No Content');
return;
}
header('HTTP/1.1 200 Ok');
return $cerveja;
});
POST Cerveja
$router->post('/cerveja', function () use ($mapper) {
if ( !isset($_POST) || !isset($_POST['cerveja']) || v::not(v::arr())->validate($_POST['cerveja']) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$valid = v::arr()->key('nome', $rule = v::alnum()->noWhitespace())->key('estilo', $rule)->validate($_POST['cerveja']);
if ( !$valid ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = new stdClass();
$cerveja->nome = filter_var($_POST['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$cerveja->estilo = filter_var($_POST['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$check = $mapper->cervejas(array( 'nome' => $cerveja->nome ))->fetch();
if ( $check ) {
header('HTTP/1.1 409 Conflict');
return 'Cerveja já existe no sistema';
}
$mapper->cervejas->persist($cerveja);
$mapper->flush();
if ( !isset($cerveja->id) || empty($cerveja->id) ) {
header('HTTP/1.1 422 Unprocessable Entity');
return 'Erro ao inserir cerveja';
}
header('HTTP/1.1 201 Created');
return 'Cerveja criada';
});
PUT Cerveja
$router->put('/cerveja/*', function ($nome) use ($mapper) {
parse_str(file_get_contents('php://input'), $data);
if ( !isset($data) || !isset($data['cerveja']) || v::not(v::arr())->validate($data['cerveja']) )
{
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( v::not(v::alnum()->notEmpty())->validate($nome) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 204 No Content');
return;
}
$newNome = filter_var( $data['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$newEstilo = filter_var( $data['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS );
$cerveja->nome = $newNome;
$cerveja->estilo = $newEstilo;
$mapper->cervejas->persist($cerveja);
$mapper->flush();
header('HTTP/1.1 200 Ok');
return 'Cerveja atualizada';
}); * removido parte do código para ficar melhor no slide
DELETE Cerveja
$router->delete('/cerveja/*', function ($nome) use ($mapper) {
$nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
if ( !isset($nome) || v::not(v::alnum()->notEmpty())->validate($nome) ) {
header('HTTP/1.1 400 Bad Request');
return 'Faltam parâmetros';
}
$cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch();
if ( !$cerveja ) {
header('HTTP/1.1 422 Unprocessable Entity');
return 'Erro ao validar cerveja';
}
$mapper->cervejas->remove($cerveja);
$mapper->flush();
header('HTTP/1.1 200 Ok');
return 'Cerveja removida';
});
Formatar Resultado
<?php
$jsonRender = function ($data) {
header('Content-Type: application/json');
if ( v::string()->validate($data) ) {
$data = array($data);
}
return json_encode($data,true);
};
$router->always('Accept', array('application/json' => $jsonRender));
Basic Auth
<?php
// do not use this!
function checkLogin($user, $pass) {
return $user === 'admin' && $pass === 'admin';
}
$router->get('/admin', function () {
return 'RestBeer Admin Protected!';
})->authBasic('Secret Area', function ($user, $pass) {
return checkLogin($user, $pass);
});
Deploy
Jelastic
- Locaweb?
- Git
- Barato
- 14 Dias Grátis
Aplicações PHP no Jelastic https://t.co/aHi3ZixLon
Referências / Links
Github
https://github.com/ivanrosolen/RestBeer-Jelastic
Respect
http://respect.github.io
Jelastic
http://www.locaweb.com.br/cloud/jelastic
https://twitter.com/kemelzaidan
http://pt.slideshare.net/ivanrosolen/jelastic-53375753
PHPSP
http://phpsp.org.br
Elton Minetto
https://github.com/eminetto/restbeer
Dúvidas?
OBRIGADO!
Avalie esta palestra
joind.in/15207 Visite phpsp.org.br

Weitere ähnliche Inhalte

Was ist angesagt?

Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosRegis Magalhães
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Thyago Maia
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Thyago Maia
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7iMasters
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionaliMasters
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisFabrízio Mello
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação WebDalton Martins
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPLuis Gustavo Almeida
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraFlávio Lisboa
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel CoutoReact e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel CoutoiMasters
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidademetzen
 

Was ist angesagt? (20)

Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Php 02 Primeiros Passos
Php 02 Primeiros PassosPhp 02 Primeiros Passos
Php 02 Primeiros Passos
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
 
PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7PHP Experience 2016 - [Palestra] Keynote: PHP-7
PHP Experience 2016 - [Palestra] Keynote: PHP-7
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
Silex 101
Silex 101Silex 101
Silex 101
 
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demaisPHP e PostgreSQL: Um é pouco, dois é bom, três é demais
PHP e PostgreSQL: Um é pouco, dois é bom, três é demais
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
React e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel CoutoReact e Ratchet, async e websockets com PHP, por Gabriel Couto
React e Ratchet, async e websockets com PHP, por Gabriel Couto
 
PHP 7
PHP 7PHP 7
PHP 7
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
 

Andere mochten auch

Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014 Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014 OSSCube
 
Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiterZend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiterRalf Eggert
 
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)James Titcumb
 
Creating an API with Expressive
Creating an API with ExpressiveCreating an API with Expressive
Creating an API with ExpressiveElton Minetto
 
REST Level 5 - A Trek To The Summit
REST Level 5 - A Trek To The SummitREST Level 5 - A Trek To The Summit
REST Level 5 - A Trek To The SummitPat Cappelaere
 
Level 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableMatt Bishop
 

Andere mochten auch (7)

Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014 Apigility – Lightning Fast API Development - OSSCamp 2014
Apigility – Lightning Fast API Development - OSSCamp 2014
 
Zend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiterZend\Expressive - höher, schneller, weiter
Zend\Expressive - höher, schneller, weiter
 
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
Kicking off with Zend Expressive and Doctrine ORM (PHPNW2016)
 
Creating an API with Expressive
Creating an API with ExpressiveCreating an API with Expressive
Creating an API with Expressive
 
REST Level 5 - A Trek To The Summit
REST Level 5 - A Trek To The SummitREST Level 5 - A Trek To The Summit
REST Level 5 - A Trek To The Summit
 
Level 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API Browsable
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 

Ähnlich wie API com Respect

Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosRegis Magalhães
 
PW03 - Programação Web PHP Arrays (Vetores)
PW03 - Programação Web PHP Arrays (Vetores)PW03 - Programação Web PHP Arrays (Vetores)
PW03 - Programação Web PHP Arrays (Vetores)Silvano Oliveira
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesAlmir Mendes
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php segurosDouglas V. Pasqua
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - TabelasDalton Martins
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Carlos Santos
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualMichael Castillo Granados
 
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação WebAula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação WebDalton Martins
 
Minicurso PHP básico
Minicurso PHP básicoMinicurso PHP básico
Minicurso PHP básicoCezar Souza
 
Validação e Operações CRUD em PHP
Validação e Operações CRUD em PHPValidação e Operações CRUD em PHP
Validação e Operações CRUD em PHPBreno Vitorino
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP2km interativa!
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaCarlos Santos
 

Ähnlich wie API com Respect (20)

Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Linguagem PHP
Linguagem PHPLinguagem PHP
Linguagem PHP
 
PW03 - Programação Web PHP Arrays (Vetores)
PW03 - Programação Web PHP Arrays (Vetores)PW03 - Programação Web PHP Arrays (Vetores)
PW03 - Programação Web PHP Arrays (Vetores)
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantes
 
Escrevendo códigos php seguros
Escrevendo códigos php segurosEscrevendo códigos php seguros
Escrevendo códigos php seguros
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
 
Aula 12 Relatório - Tabelas
Aula 12   Relatório - TabelasAula 12   Relatório - Tabelas
Aula 12 Relatório - Tabelas
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
A Revolução dos Middlewares
A Revolução dos MiddlewaresA Revolução dos Middlewares
A Revolução dos Middlewares
 
Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4Aula 01 PHP+MySQL - LabMM4
Aula 01 PHP+MySQL - LabMM4
 
Da Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtualDa Argila Ao Forte - Como desenvolver uma loja virtual
Da Argila Ao Forte - Como desenvolver uma loja virtual
 
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação WebAula 08 - Introdução ao banco de dados MySQL - Programação Web
Aula 08 - Introdução ao banco de dados MySQL - Programação Web
 
Minicurso PHP básico
Minicurso PHP básicoMinicurso PHP básico
Minicurso PHP básico
 
Validação e Operações CRUD em PHP
Validação e Operações CRUD em PHPValidação e Operações CRUD em PHP
Validação e Operações CRUD em PHP
 
Criando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHPCriando e consumindo Web Services (REST) com o CakePHP
Criando e consumindo Web Services (REST) com o CakePHP
 
LabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurançaLabMM4 (T22 - 12/13) - segurança
LabMM4 (T22 - 12/13) - segurança
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 

Mehr von Ivan Rosolen

15 mandamentos de um bom programador
15 mandamentos de um bom programador15 mandamentos de um bom programador
15 mandamentos de um bom programadorIvan Rosolen
 
Utilizando Filas com PHP
Utilizando Filas com PHPUtilizando Filas com PHP
Utilizando Filas com PHPIvan Rosolen
 
Boas Práticas com PHP
Boas Práticas com PHPBoas Práticas com PHP
Boas Práticas com PHPIvan Rosolen
 
Mercado de Tecnologia
Mercado de TecnologiaMercado de Tecnologia
Mercado de TecnologiaIvan Rosolen
 
Deploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no JelasticDeploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no JelasticIvan Rosolen
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Ivan Rosolen
 
Tecnologias e Inovação
Tecnologias e InovaçãoTecnologias e Inovação
Tecnologias e InovaçãoIvan Rosolen
 
Cassandra 7 masters
Cassandra 7 mastersCassandra 7 masters
Cassandra 7 mastersIvan Rosolen
 
Quando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoQuando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoIvan Rosolen
 
Case: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flowCase: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flowIvan Rosolen
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoIvan Rosolen
 

Mehr von Ivan Rosolen (17)

15 mandamentos de um bom programador
15 mandamentos de um bom programador15 mandamentos de um bom programador
15 mandamentos de um bom programador
 
Utilizando Filas com PHP
Utilizando Filas com PHPUtilizando Filas com PHP
Utilizando Filas com PHP
 
Filas com php
Filas com phpFilas com php
Filas com php
 
Boas Práticas com PHP
Boas Práticas com PHPBoas Práticas com PHP
Boas Práticas com PHP
 
Mercado de Tecnologia
Mercado de TecnologiaMercado de Tecnologia
Mercado de Tecnologia
 
Deploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no JelasticDeploy automatizado de Aplicações no Jelastic
Deploy automatizado de Aplicações no Jelastic
 
Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)Autenticação com Json Web Token (JWT)
Autenticação com Json Web Token (JWT)
 
JSON Web Tokens
JSON Web TokensJSON Web Tokens
JSON Web Tokens
 
Tecnologias e Inovação
Tecnologias e InovaçãoTecnologias e Inovação
Tecnologias e Inovação
 
Jelastic
JelasticJelastic
Jelastic
 
Aws video creator
Aws video creatorAws video creator
Aws video creator
 
Cassandra 7 masters
Cassandra 7 mastersCassandra 7 masters
Cassandra 7 masters
 
Quando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucessoQuando o planejamento da infraestrutura leva ao sucesso
Quando o planejamento da infraestrutura leva ao sucesso
 
Case: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flowCase: PHP como Base de Digital Asset Management – arizona.flow
Case: PHP como Base de Digital Asset Management – arizona.flow
 
Php e Cassandra
Php e Cassandra Php e Cassandra
Php e Cassandra
 
PHPT
PHPTPHPT
PHPT
 
CakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápidoCakePHP e o desenvolvimento rápido
CakePHP e o desenvolvimento rápido
 

API com Respect

  • 1. Criando APIs usando o micro-framework Respect
  • 2. Ivan Rosolen Graduado em Sistemas de Informação Pós-graduado em Gerência de Projetos Desenvolvedor a 14+ anos Autor de vários PHPT (testes para o PHP) Entusiasta de novas tecnologias Head of Innovation @ Arizona CTO @ Mokation
  • 4. API
  • 5. Vantagens - Troca de informações entre sistemas - Múltiplas interfaces (web, mobile, CLI) - Módulos/Componentes - HTTP Status Codes - Controle de Acesso https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
  • 7. API com informações de Ceveja! GET - http://hostname/cerveja/ POST - http://hostname/cerveja/ cerveja[nome] cerveja[estilo] PUT - http://hostname/cerveja/NOME cerveja[nome] cerveja[estilo] DELETE - http://hostname/cerveja/NOME
  • 9. Micro-framework para PHP 5.3+ construido por Alexandre Gaigalas (alganet) e comunidade.
  • 10. Como?
  • 11. Composer - Controle de dependências curl -s http://getcomposer.org/installer | php php composer.phar install https://getcomposer.org
  • 12. { "name": "RestBeer Jelastic Demo", "authors": [ { "name": "Ivan Rosolen", "email": "ivanrosolen@gmail.net" } ], "require": { "respect/rest": "0.5.x", "respect/relational": "0.5.x", "respect/config": "0.3.x", "respect/validation": "0.4.x" } }
  • 13. Respect/Config - Apenas arquivos .INI - Usa o mesmo parser nativo e rápido do php.ini - Extende o arquivo .INI com seu próprio “dialeto” - Implementa lazy loading para instâncias de objeto https://github.com/Respect/Config
  • 14. db_server = "127.0.0.1" db_name = "restbeer" db_user = "user" db_pwd = "pwd" dsn_mysql = "mysql:host=[db_server];dbname=[db_name]" <?php use RespectConfigContainer; // Ler arquivo de configuração $config = new Container('config.ini'); echo $config->dsn_mysql; // mysql:host=127.0.0.1;dbname=restbeer
  • 15. Respect/Relational - Quase zero de configuracão (convenção) - Fluent interface: $mapper->author[7]->fetch(); - Diferentes tipos de banco de dados - Registros são tratados como Plain Data Object https://github.com/Respect/Relational
  • 16. <?php use RespectRelationalMapper; // criar instância PDO com o banco $mapper = new Mapper(new PDO('seudsn')); // buscar todos os autores $authors = $mapper->author->fetchAll(); // criar objeto de um registro $obj = new stdClass; $obj->name = 'Ivan Rosolen'; // "gravar" informação no banco $mapper->author->persist($obj); $mapper->flush();
  • 17. Respect/Validation - Fluent/Chained interface: v::numeric()->positive()->between(1, 256)->validate($num) - 100+ validadores testados - Fácil extender ou criar novas regras (Concrete API) - Php 7 ( Quase pronto ) https://github.com/Respect/Validation
  • 18. use RespectValidationValidator as v; // validar número simples v::numeric()->validate(42); //true // validar em cadeia $v = v::arr() // validar se é array ->key('nome', $rule = v::alnum()->notEmpty()->noWhitespace()) // validar a key 'nome' ->key('estilo', $rule) // utilizando a mesma regra da key de cima ->validate($_POST['cerveja']); // negação de qualquer regra $v = v::not(v::int())->validate(10); // false // operadores lógicos v::allOf(v::numeric(), v::hexa(), v::min(1)); // numeric, hexadecimal e pelo menos 1 v::oneOf(v::nullValue(), v::numeric()); // null ou numeric
  • 19. Respect/Router - Thin and lightweight controller para aplicações RESTful e APIs - “Don't try to change PHP, small learning curve.” - If/Before/After/Accept/Auth/Any/By … https://github.com/Respect/Rest
  • 20. <?php use RespectRestRouter; // Criar instância do router $router = new Router; // raiz http://example.com/ // instância para trabalhar em uma subpasta $router = new Router('/pasta'); // raiz http://example.com/pasta // Olá mundo $router->get('/', function() { return 'Hello World'; }); // Separando regras das rotas :D $router->get('/api/uri/*/*', 'NamespaceCoolClass'); $router->post('/api/uri/', 'NamespaceCoolClass'); $router->put('/api/uri/', 'NamespaceCoolClass'); $router->delete('/api/uri/*', 'NamespaceCoolClass');
  • 22. <?php require_once realpath(__DIR__ . '/vendor/autoload.php'); use RespectRestRouter; use RespectConfigContainer; use RespectValidationValidator as v; use RespectRelationalMapper; //Ler arquivo de configuração $config = new Container('config.ini'); // Criar instância PDO com o SQLite usando as configs $mapper = new Mapper(new PDO($config->dsn_sqlite)); // Criar instância do router $router = new Router(); //Rota para qualquer tipo de request (any) $router->any('/', function () { return 'RestBeer!'; });
  • 24. $router->get('/cerveja/*', function ($data = null) use ($mapper) { if ( !isset($data) ) { $cervejas = $mapper->cervejas->fetchAll(); header('HTTP/1.1 200 Ok'); return $cervejas; } $data = filter_var( $data, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( v::not(v::alnum()->notEmpty())->validate($data) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = $mapper->cervejas(array( 'nome' => $data ))->fetch(); if ( !$cerveja ) { header('HTTP/1.1 204 No Content'); return; } header('HTTP/1.1 200 Ok'); return $cerveja; });
  • 26. $router->post('/cerveja', function () use ($mapper) { if ( !isset($_POST) || !isset($_POST['cerveja']) || v::not(v::arr())->validate($_POST['cerveja']) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $valid = v::arr()->key('nome', $rule = v::alnum()->noWhitespace())->key('estilo', $rule)->validate($_POST['cerveja']); if ( !$valid ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = new stdClass(); $cerveja->nome = filter_var($_POST['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); $cerveja->estilo = filter_var($_POST['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); $check = $mapper->cervejas(array( 'nome' => $cerveja->nome ))->fetch(); if ( $check ) { header('HTTP/1.1 409 Conflict'); return 'Cerveja já existe no sistema'; } $mapper->cervejas->persist($cerveja); $mapper->flush(); if ( !isset($cerveja->id) || empty($cerveja->id) ) { header('HTTP/1.1 422 Unprocessable Entity'); return 'Erro ao inserir cerveja'; } header('HTTP/1.1 201 Created'); return 'Cerveja criada'; });
  • 28. $router->put('/cerveja/*', function ($nome) use ($mapper) { parse_str(file_get_contents('php://input'), $data); if ( !isset($data) || !isset($data['cerveja']) || v::not(v::arr())->validate($data['cerveja']) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( v::not(v::alnum()->notEmpty())->validate($nome) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch(); if ( !$cerveja ) { header('HTTP/1.1 204 No Content'); return; } $newNome = filter_var( $data['cerveja']['nome'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ); $newEstilo = filter_var( $data['cerveja']['estilo'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ); $cerveja->nome = $newNome; $cerveja->estilo = $newEstilo; $mapper->cervejas->persist($cerveja); $mapper->flush(); header('HTTP/1.1 200 Ok'); return 'Cerveja atualizada'; }); * removido parte do código para ficar melhor no slide
  • 30. $router->delete('/cerveja/*', function ($nome) use ($mapper) { $nome = filter_var( $nome, FILTER_SANITIZE_FULL_SPECIAL_CHARS ); if ( !isset($nome) || v::not(v::alnum()->notEmpty())->validate($nome) ) { header('HTTP/1.1 400 Bad Request'); return 'Faltam parâmetros'; } $cerveja = $mapper->cervejas(array( 'nome' => $nome ))->fetch(); if ( !$cerveja ) { header('HTTP/1.1 422 Unprocessable Entity'); return 'Erro ao validar cerveja'; } $mapper->cervejas->remove($cerveja); $mapper->flush(); header('HTTP/1.1 200 Ok'); return 'Cerveja removida'; });
  • 32. <?php $jsonRender = function ($data) { header('Content-Type: application/json'); if ( v::string()->validate($data) ) { $data = array($data); } return json_encode($data,true); }; $router->always('Accept', array('application/json' => $jsonRender));
  • 34. <?php // do not use this! function checkLogin($user, $pass) { return $user === 'admin' && $pass === 'admin'; } $router->get('/admin', function () { return 'RestBeer Admin Protected!'; })->authBasic('Secret Area', function ($user, $pass) { return checkLogin($user, $pass); });
  • 36. Jelastic - Locaweb? - Git - Barato - 14 Dias Grátis Aplicações PHP no Jelastic https://t.co/aHi3ZixLon