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

APIs Eficazes com PHP

Avatar for Ravan Scafi 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/

Avatar for Ravan Scafi

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