APIs: o que são? onde vivem? do que se alimentam? [PyNE2016]

Preview:

Citation preview

APIs: o que são, onde vivem, do que se

alimentam?Filipe Ximenes

APIs: O que são?

Onde vivem? Do que se alimentam?

No programa de hoje

Sobre

● Filipe Ximenes (Xima)○ Recife○ Vinta○ 4 anos na comunidade Python○ Django○ Javascript○ APIs

Open source

Django Role Permissionshttps://github.com/vintasoftware/django-role-permissions

Tapiocahttps://github.com/vintasoftware/tapioca-wrapper

● Entender o que é uma API.● Entender quando e por que temos que

desenvolver APIs● Explorar os principais conceitos relacionados

ao desenvolvimento delas.● Desmistificar termos e expressões.

Objetivos da palestra

● APIs definem a interface de interação de um software

● Software○ Uma classe Python○ Um banco de dados○ Um hardware○ Um plugin○ Uma biblioteca○ Um serviço web

O que é uma API?

Ex.: uma classe de Python

class User(object):

name = ''

email = ''

def update_data(self, name, email):

self.name = name

self.email = email

def talk(self, message):

print('{} says: {}'.format(self.name, message))

APIs web

Para que serve uma API?

● Pequenas interações numa página○ Autocomplete○ Busca sem reload

● Aplicativo de celular● Aplicações de uma página (Single Page

Applications - SPA)○ React○ Angular

● Disponibilização de serviços para terceiros (APIs públicas)

Instagram

https://www.instagram.com/developer/endpoints/users/

Ultimas coisas postadas pelo usuário

Ultimas coisas postadas pelo usuário

Como funciona a internet

Client - Servidor

● Aplicação (HTTP)● Transporte (TCP, UDP)● Internet (IP) ● Interfaces físicas (Ethernet, ATM, Wi-fi)

Camadas da internet

HTTP

GET /index.html HTTP/1.1Host: www.example.com

A requisição HTTP

GET /index.html HTTP/1.1Host: www.example.com

A requisição HTTP

método caminho

endereço

Métodos HTTP

● GET● POST● PUT● PATCH● DELETE

Caminho & Endereço

URL = Endereço + Caminho

HTTP/1.1 200 OKDate: Mon, 27 Jul 2009 12:28:53 GMTServer: Apache/2.2.14 (Win32)Last-Modified: Wed, 22 Jul 2009 19:15:56 GMTContent-Type: text/htmlConnection: Closed

<h1>Hello World</h1>

A resposta HTTP

A resposta HTTP

HTTP/1.1 200 OKDate: Mon, 27 Jul 2009 12:28:53 GMTServer: Apache/2.2.14 (Win32)Last-Modified: Wed, 22 Jul 2009 19:15:56 GMTContent-Type: text/htmlConnection: Closed

<h1>Hello World</h1> Body

Status

Media type

Status

● 200 OK● 201 CREATED

● 301 MOVED PERMANENTLY

● 302 FOUND

● 400 BAD REQUEST● 401 UNAUTHORIZED● 404 NOT FOUND

● 500 INTERNAL SERVER ERROR

https://httpstatusdogs.com

Body & Media types

● Conteúdo da mensagem● Pode ser qualquer tipo de texto capaz de

trafegar pelo protocolo HTTP

HTML

<html> <head> </head> <body> <h1>PyNE</h1> <p>\o/\o/\o/</p> </body></html>

HTTP & HTML

Hyper Text Transfer Protocol (HTTP)

Hyper Text Markup Language (HTML)

XML

<?xml version="1.0" encoding="UTF-8"?>

<conferencia>

<nome>PyNE</nome>

<mensagem>\o/\o/\o/</mensagem>

</conferencia>

JSON

{ "conferencia": "PyNE", "mensagem": "\o/\o/\o/"}

Aplicação web HTML vs. API

<html> <head> </head> <body> <h1>PyNE</h1> <p>\o/\o/\o/</p> </body></html>

{ "conferencia": "PyNE", "mensagem": "\o/\o/\o/"}

Padrões* de API webRPC vs. REST

RPC

● Remote Procedure Call● Protocolos:

○ RMI - Remote Method Invocation○ CORBA - Common Object Request Broker

Architecture○ SOAP - Simple Object Access Protocol

SOAPGET /api HTTP/1.1Host: www.example.com

<?xml version="1.0"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Header> </soap:Header> <soap:Body> <m:GetStockPrice xmlns:m="http://www.example.org/stock/Surya"> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> ...</soap:Envelope>

REST

● REpresentational State Transfer● Roy Fielding

○ Protocolo HTTP (1997)○ REST (2000)

● Estilo arquitetural● O protocolo HTTP é RESTful*● Muito popular para se construir APIs

REST

● Tangíves ou intangíveis● Recurso != Tabela do banco de dados

○ 1 ou + tabelas○ Processamento

● Substantivos

Recursos (resources)

Recursos (resources)

● Peças de uma bicicleta● Bicicleta montada● Trajeto percorrido● Registro da manutenção da bicicleta● Acessórios

● Completa ou parcial● Quantidade por recurso: [0, +infinito)● Segurança

Representações

Representações

● Rodas● Quadro● Pedal● Guidão● Freios● Tamanho

● Marca● Ano● Modelo

Representações<bicicleta>

<quadro><tamanho>52</tamanho><cor>preto</cor>

</quadro><guidao>

<tamanho>60</tamanho></guidao>

</bicicleta>

{"quadro": {

"tamanho": 52,"cor": "preto"

}"guidao": {

"tamanho": 60}

}

URLs

http://www.example.org/api/bicicletas

● Uniform Resource Locator● Localizar recursos

Endpoint = URL + Recurso

Ações (métodos HTTP)

● Verbos

GET Recuperar

POST Criar

PUT Editar

DELETE Deletar

Vamos construir uma API!

Sistema para montar bicicletas customizadas

● Criar/Recuperar/Editar uma bicicleta com um nome.

● Listar peças disponíveis.● Adicionar peças na bicicleta.

Nossos recursos

● Peças○ Código identificador○ Tipo (quadro, guidão, banco, …)○ Cor

● Bicicleta○ Código identificador○ Nome○ Lista de peças

Criando a bicicleta

POST /api/bicicletas HTTP/1.1Host: www.example.comContent-Type: application/json

{ "nome": "Bicipy"}

Criando a bicicleta (resposta)

HTTP/1.1 201 CREATEDLocation: /api/bicicletas/1

Editando a bicicleta

PUT /api/bicicletas/1 HTTP/1.1Host: www.example.comContent-Type: application/json

{ "nome": "Bicipy PyNE"}

Editando a bicicleta (resposta)

HTTP/1.1 200 OKContent-Type: application/json

{ "nome": "Bicipy PyNE"}

Listando as peças

GET /api/pecas HTTP/1.1Host: www.example.com

Listando as peças (resposta)

HTTP/1.1 200 OKContent-Type: application/json

[{"id": 1, "tipo": "Roda", "cor": "Azul"},{"id": 2, "tipo": "Quadro", "cor": "Vermelho"},

{"id": 3, "tipo": "Guidão", "cor": "Preto"}

]

Adicionando peças na bicicleta

POST /api/bicicletas/1/pecas HTTP/1.1Host: www.example.comContent-Type: application/json

[1, 3]

Adicionando peças na bicicleta (resposta)

HTTP/1.1 201 CREATEDLocation: /api/bicicletas/1/pecas

Recuperando a bicicleta

GET /api/bicicletas/1 HTTP/1.1Host: www.example.com

Recuperando a bicicleta (resposta)HTTP/1.1 200 OKContent-Type: application/json

{"nome": "Bicipy PyNE","pecas": [

{"id": 1, "tipo": "Roda", "cor": "Azul"}, {"id": 3, "tipo": "Guidão", "cor": "Preto"}]

}

Cabô?

Clientes de API ou Wrappers

● Implementam as chamadas a uma API usando a sua linguagem de programação○ Autenticação○ Composição das URLs○ Processamento de requisições e respostas

https://github.com/vintasoftware/tapioca-wrapper

Outros termos importantes

● Authenticação:○ Basic Authentication○ Token○ OAuth 1○ OAuth 2

● Versionamento● Permissões● Paginação● Throttling● HATEOAS

Link da palestra: bit.ly/apis-o-que-sao

Twitter: @ximaGithub: filipeximenesEmail: ximenes@vinta.com.br

Perguntas?