Slide 1

Slide 1 text

APIs Eficazes Com PHP

Slide 2

Slide 2 text

Sobre Mim Ravan Scafi Back-end Developer na Leroy Merlin Brasil Co-organizador do Meetup do Laravel SP @ravanscafi

Slide 3

Slide 3 text

API? O que é uma API?

Slide 4

Slide 4 text

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.

Slide 5

Slide 5 text

(ou porque a gente tá aqui hoje) API REST em 1 Minuto

Slide 6

Slide 6 text

API REST em 1 minuto Cada recurso tem seu próprio URI GET http://meusite.dev/api/users/rscafi

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

API REST em 1 minuto Diferenciação por IDs GET http://meusite.dev/api/users/rscafi

Slide 9

Slide 9 text

Motivação Por que fazer uma API? E o que isto implica?

Slide 10

Slide 10 text

Documentação Como e por que documentar uma API?

Slide 11

Slide 11 text

“ apiary.io “Uma API é apenas tão boa quanto sua documentação”

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Swagger / Open API Initiative Uma forma de documentar sua API

Slide 14

Slide 14 text

Swagger / Open API Initiative Único arquivo swagger.json (ou .yml)

Slide 15

Slide 15 text

Swagger / Open API Initiative Consumível por humanos e máquinas

Slide 16

Slide 16 text

{ "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]" },

Slide 17

Slide 17 text

"paths": { "/pet": { "post": { "tags": [ "pet" ], "summary": "Add a new pet to the store", "description": "", "operationId": "addPet", "consumes": [ "application/json", "application/xml"

Slide 18

Slide 18 text

"parameters": [ { "in": "body", "name": "body", "description": "Pet object that needs to (...)", "required": true, "schema": { "$ref": "#/definitions/Pet" } } ], "responses": { "405": { "description": "Invalid input"

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Documentação Mantenha próxima ao código

Slide 21

Slide 21 text

Documentação Revisite periodicamente

Slide 22

Slide 22 text

Documentação Se possível, faça Documentation-First

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

/** * @SWG\Info(title="My First API", version="0.1") */ /** * @SWG\Get( * path="/api/resource.json", * @SWG\Response(response="200", description="An example resource") * ) */

Slide 25

Slide 25 text

Empatia é a chave

Slide 26

Slide 26 text

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.

Slide 27

Slide 27 text

Design O que me atentar ao fazer uma API?

Slide 28

Slide 28 text

Versionamento Somente exponha a “versão cheia” (v1, v2)

Slide 29

Slide 29 text

Versionamento Evite ao máximo Breaking Changes

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Proteja-se com Mutators Representam Recursos da API

Slide 32

Slide 32 text

Proteja-se com Mutators Criam uma barreira entre seus Models e sua API

Slide 33

Slide 33 text

Auxiliam em Typecasting e Relacionamentos Proteja-se com Mutators

Slide 34

Slide 34 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 35

Slide 35 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 36

Slide 36 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 37

Slide 37 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 38

Slide 38 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 39

Slide 39 text

"{$user->firstName} {$user->lastName}", 'email' => $user->getEmail(), 'birthday' => $user->birthday->format(DateTime::RFC3339), ]; } }

Slide 40

Slide 40 text

Negociação de Conteúdo Como ter uma comunicação eficiente com os usuários?

Slide 41

Slide 41 text

JSON, XML, CSV? Negociação de Conteúdo

Slide 42

Slide 42 text

Trazer Relacionamentos e Recursos Embeddados? Negociação de Conteúdo

Slide 43

Slide 43 text

Metadados: URI, página atual, contagem total Negociação de Conteúdo

Slide 44

Slide 44 text

Use cabeçalhos HTTP quando relevante Negociação de Conteúdo

Slide 45

Slide 45 text

Respostas Como passar as informações corretas aos usuários?

Slide 46

Slide 46 text

Padronize códigos HTTP de resposta Respostas

Slide 47

Slide 47 text

Padronize campos de datas, floats, moedas Respostas

Slide 48

Slide 48 text

Padronize Metadados Respostas

Slide 49

Slide 49 text

Não reinvente a roda Respostas

Slide 50

Slide 50 text

{ "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" }

Slide 51

Slide 51 text

{ "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 }

Slide 52

Slide 52 text

{ "errorCode": 500, "errors": [ "Unknown error occurred. Check you input or try again later." ] } Nunca exponha Exceções para o Usuário { "exception": “NullPointerException” }

Slide 53

Slide 53 text

Autorização e Autenticação Como identificar meus usuários e suas permissões?

Slide 54

Slide 54 text

Autorização e Autenticação Qual a diferença?

Slide 55

Slide 55 text

Autorização Baseada em Sessão: NÃO

Slide 56

Slide 56 text

Autorização APIs devem ser sem estados (stateless)

Slide 57

Slide 57 text

Autorização Implementação em Mobile pode ser custosa

Slide 58

Slide 58 text

Autorização Baseada em Tokens: SIM

Slide 59

Slide 59 text

Segurança Como proteger minha API?

Slide 60

Slide 60 text

Segurança Evite expor IDs sequenciais (use HashIDs por exemplo)

Slide 61

Slide 61 text

Segurança Limite requisições, de forma configurável (throttling)

Slide 62

Slide 62 text

Segurança Não utilize logins por senha (exceto em apps próprios)

Slide 63

Slide 63 text

Segurança API somente em HTTPS

Slide 64

Slide 64 text

Dicas e Recursos Onde ir a seguir?

Slide 65

Slide 65 text

OAuth 2.0 Fluxos de Autorização

Slide 66

Slide 66 text

JWT Tokens de Autenticação

Slide 67

Slide 67 text

GraphQL Negociação de Conteúdo e Documentação! (substitui o REST)

Slide 68

Slide 68 text

● Build APIs You Won’t Hate ● HTTP API Design Guide ● Open API Initiative ● Petstore (Swagger UI) ● 2 Legged OAuth ● API Evangelist Leituras

Slide 69

Slide 69 text

● Slack APIs You Won’t Hate ● ngrok ● Apigee ● Postman ● Paw Dicas

Slide 70

Slide 70 text

Empatia é a chave

Slide 71

Slide 71 text

Obrigado! @ravanscafi https://joind.in/talk/913dd

Slide 72

Slide 72 text

Estamos Contratando! Dev BackEnd, Dev FrontEnd [email protected]

Slide 73

Slide 73 text

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