Upgrade to Pro — share decks privately, control downloads, hide ads and more …

APIs Eficazes com PHP

Ravan Scafi
November 24, 2016

APIs Eficazes com PHP

Construir uma API pode parecer fácil. Algumas rotas que retornam conteúdo em JSON, uma forma de autenticação e está pronta. Será mesmo? Uma API eficaz preocupa-se com os desenvolvedores que irão consumi-la. Entenda conceitos como autenticação, autorização, documentação, padronização e negociação de conteúdo. Conheça boas práticas, dicas de segurança, livros, pacotes e recursos úteis.

Essa talk foi apresentada no PHPSP + Talks #1 - Google
https://www.meetup.com/pt-BR/php-sp/events/235641294/

Por favor, avalie a palestra e/ou os slides!
https://joind.in/event/phpsp-talks-1/apis-eficazes-com-php

# Pacotes Relevantes
- Swagger PHP
https://github.com/zircote/swagger-php

- League OAuth2 Server
https://github.com/thephpleague/oauth2-server

- League OAuth2 Client
https://github.com/thephpleague/oauth2-client

- JWT
https://github.com/lcobucci/jwt

- League Fractal
https://github.com/thephpleague/fractal

# Links da Apresentação
- Tweet sobre a API da UPS
https://twitter.com/danharper7/status/748550285761601536

- OAuth 2.0 Specification
https://oauth.net/2/

- JWT.io
https://jwt.io/

- GraphQL
http://graphql.org/

- Livro Build APIs You Won’t Hate do Phil Sturgeon
https://leanpub.com/build-apis-you-wont-hate

- HTTP API Design Guide
https://github.com/interagent/http-api-design

- Open API Initiative
https://openapis.org/

- Petstore (Swagger UI)
http://petstore.swagger.io/

- 2 Legged OAuth
http://stackoverflow.com/questions/14250383/how-does-2-legged-oauth-work-in-oauth-2-0

- API Evangelist
http://apievangelist.com/

- Slack APIs You Won’t Hate
https://slack.apisyouwonthate.com/

- ngrok
https://ngrok.com/

- Apigee
http://apigee.com/about/

- Postman
https://www.getpostman.com/

- Paw
https://paw.cloud/

Agradecimento ao Slides Carnival
http://www.slidescarnival.com/

Ravan Scafi

November 24, 2016
Tweet

More Decks by Ravan Scafi

Other Decks in Technology

Transcript

  1. Sobre Mim Ravan Scafi Back-end Developer na Leroy Merlin Brasil

    Co-organizador do Meetup do Laravel SP @ravanscafi
  2. Interface é um elemento que proporciona uma ligação física ou

    lógica entre dois sistemas ou partes de um sistema que não poderiam ser conectados diretamente.
  3. API REST em 1 minuto Cada recurso tem seu próprio

    URI GET http://meusite.dev/api/users/rscafi
  4. API REST em 1 minuto Verbos HTTP indicam a ação

    GET http://meusite.dev/api/users/rscafi
  5. { "swagger": "2.0", "info": { "description": "This is a sample

    server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) (...)", "version": "1.0.0", "title": "Swagger Petstore", "termsOfService": "http://swagger.io/terms/", "contact": { "email": "[email protected]" },
  6. "paths": { "/pet": { "post": { "tags": [ "pet" ],

    "summary": "Add a new pet to the store", "description": "", "operationId": "addPet", "consumes": [ "application/json", "application/xml"
  7. "parameters": [ { "in": "body", "name": "body", "description": "Pet object

    that needs to (...)", "required": true, "schema": { "$ref": "#/definitions/Pet" } } ], "responses": { "405": { "description": "Invalid input"
  8. /** * @SWG\Info(title="My First API", version="0.1") */ /** * @SWG\Get(

    * path="/api/resource.json", * @SWG\Response(response="200", description="An example resource") * ) */
  9. Empatia é a capacidade de se identificar com outra pessoa,

    de sentir o que ela sente, de querer o que ela quer, de apreender do modo como ela apreende etc.
  10. NÃO • Adicionar campos • Adicionar recursos • Adicionar endpoints

    • Corrigir bugs * O que causa uma Breaking Change? SIM • Remover campos • Renomear campos • Remover recursos • Remover endpoints
  11. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  12. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  13. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  14. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  15. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  16. <?php namespace Api\V1\Transformers\User; use Api\V1\Transformers\TranformerInterface; use DateTime; class UserTransformer implements

    TranformerInterface { public function transform(User $user) { return [ 'name' => "{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }
  17. { "data": { "name": "John Doe", "email": "[email protected]", "birthday": "17/09/2016"

    } } Faça um “wrap” da resposta { "name": "John Doe", "email": "[email protected]", "birthday": "17/09/2016" }
  18. { "errorCode": 451942, "errors": [ "Username must contain only letters

    and numbers", "E-mail is required" ] } Mostre a descrição do erro, não somente um código { "error": 451942 }
  19. { "errorCode": 500, "errors": [ "Unknown error occurred. Check you

    input or try again later." ] } Nunca exponha Exceções para o Usuário { "exception": “NullPointerException” }
  20. • Build APIs You Won’t Hate • HTTP API Design

    Guide • Open API Initiative • Petstore (Swagger UI) • 2 Legged OAuth • API Evangelist Leituras
  21. Agradecimentos Agradecimentos especiais a todos do SlidesCarnival que fizeram e

    disponibilizaram o template da apresentação gratuitamente. Ao PHPSP pelo convite e organização do evento <3