SlideShare uma empresa Scribd logo
1 de 61
Baixar para ler offline
Descobrindo 


APIs REST
Guilherme Cavalcanti
github.com/guiocavalcanti
Por quê?
1º

Definição

Hermética
2º

apotonick/roar
kevinswiber/siren
jsonapi.org

Como?

Por quê?

intridea/grape
lostisland/sawyer
caelum/restfulie
3º

What the f* is

Representational State Transfer
“I am getting frustrated by the number of
people calling any HTTP-based interface a
REST API.”
–Roy Fielding
Como?
•

Problema conhecido por todos

•

Passo a passo para projetar e implementar uma API
REST

•

Erros comuns, trade-offs e falácias
O que é rest e hypermedia?
•

Estilo arquitetural

•

Restrições
O que é REST/Hypermedia?
•

Construção de sistemas distribuídos
•

Em 99% dos casos sistemas que funcionam na
Web

•

Aplicativos mobile conversando com APIs

•

Aplicativos Web convesando com Aplicativos Web

•

Walledgarden
O processo
1. Entender o workflow que a API irá implementar
2. Construir máquina de estados
3. Construir media types
4. Implementar :)
Entender o workflow
Entender workflow

•

Pensar em termos de processos de negócio

•

Quantos e quais passos serão necessários?
Pagamento

Pedido
O Problema

•

Ciclo de pedido

•

Ciclo de pagamento

•

Independentes

•

Comunicação assíncrona
através de message queue

•

Maximiza throughput
Pagamento

Pedido
Message Queue
Simplificado
•

Na verdade são 3 ciclos independentes

•

Mais lucros

•

Dica: Starbucks Does Not Use Two-Phase Commit
Criar máquina de estados
Criar máquina de estados: cliente

Pedir

Sanduíche
preparado

Atualizar

Pagar

Pagamento
realizado

Pegar

Sanduíche
entregue
Caixa

Escolher
pedido

Sanduíche
Escolhido

Lançar 

pagamento

Pagamento
Lançado
Construir media type
( o que é media type? )
“To some extent, people get REST wrong
because I failed to include enough detail on
media type design within my dissertation.
That’s because I ran out of time […]”
–Roy T. Fielding
Media types
•

É o que o cliente precisa saber para entender:
•

Comportamento (ou seja, quais transições saem
de ume estado)

•

Semântica de alguns atributos da representação
Exemplo: text/html

•

Ao clicar no <a>: Requisição GET	
  para href

•

Ao submeter um <form>: Requisição method para
action
Exemplo: text/html
•

O browser só precisa entender o media type.

•

Tanto faz se você está vendo o extrato da sua conta
do banco ou um verbete na Wikipedia

•

media type = comportamento + semântica
Exemplo: APIs
•

Erros de validação

•

Internacionalização de mensagens

•

URLs
Media types
•

É por isso que sempre dizem que APIs REST não
precisam de Documentação

•

Você só precisa descrever os media types utilizados

•

A semântica dos métodos HTTP já é bem definida

•

Utilizado nos cabeçalhos Accept e Content-­‐type
Voltando:
Construir media type
Voltando:
Construir media type
Sanduíche
Variante

Feito por terceiros

application/vnd.subway.sanduiche-­‐v1+json
Nome
Sanduíche: Semântica
•

id	
  

•

created_at	
  

•

pao	
  

•

queijo	
  

•

status	
  

•

updated_at
Pagamento: Semântica
•

id	
  

•

created_at	
  

•

numero_cartao	
  

•

expira_em	
  

•

valor
Semântica

•

Atributos que tem o mesmo significado para todos
os recursos da API

•

Comportamentos inesperados (erros de validação)
Comportamento: Relacionamentos
{	
  
	
  	
  "links":	
  [	
  
	
  	
  	
  	
  {	
  "rel":	
  "self",	
  "href":	
  "/pedidos/1"	
  },	
  
	
  	
  	
  	
  {	
  "rel":	
  "pagamento",	
  "href":	
  "/pagamentos/pedidos/1"	
  }	
  
	
  	
  ]	
  
}
Comportamento: Relacionamentos
•

Representam as transições da nossa máquina de
estados

•

Aumentam o desacoplamento

•

O cliente não precisa saber URLs a priori
Mas… Quais métodos utilizar?
“[…] methods are not given meaning by the media
type. Instead, the media type tells the client either
what method to use (e.g., anchor implies GET) or how
to determine the method to use (e.g., form element
says to look in method attribute). The client should
already know what the methods mean (they are
universal) and how to dereference a URI.”
–Roy T. Fielding
HTTP Methods
•

GET

•

POST

•

PUT

•

PATCH

•

DELETE

•

OPTIONS
“ Rails is not restful “
Kind of comment…
Implementar
Pedir

Sanduíche
preparado

Atualizar

Pagar

Pagamento
realizado

Pegar

Sanduíche
entregue
Fazer pedido: Requisição
POST	
  /pedidos	
  HTTP/1.1	
  
Accept:	
  application/vnd.subway.sanduiche-­‐v1+json




{	
  
	
  	
  	
  	
  "pao":	
  "3queijos",	
  
	
  	
  	
  	
  "queijo":	
  "suíço",	
  
	
  	
  	
  	
  "recheio":	
  "club"	
  
}
Fazer pedido: Resposta
HTTP/1.1	
  201	
  Created	
  
Content-­‐type:	
  application/vnd.subway.sanduiche-­‐v1+json




{	
  
	
  	
  "id":	
  "1",	
  
	
  	
  "created_at":	
  "2013-­‐10-­‐23T05:02Z",	
  
	
  	
  "updated_at":	
  null,	
  
	
  	
  "pao":	
  "3	
  queijos",	
  
	
  	
  "queijo":	
  "suíço",	
  
	
  	
  "recheio":	
  "club",	
  
	
  	
  "status":	
  “em	
  preparo",	
  
	
  	
  "links":	
  [	
  
	
  	
  	
  	
  {	
  "rel":	
  "self",	
  "href":	
  "/pedidos/1"	
  },	
  
	
  	
  	
  	
  {	
  "rel":	
  "pagamento",	
  "href":	
  "/pagamentos/pedidos/1"	
  }	
  
	
  	
  ]	
  
}
Atualizar pedido: Requisição
PATCH	
  /pedidos/1	
  HTTP/1.1	
  
Accept:	
  application/vnd.subway.sanduiche-­‐v1+json




{	
  
	
  	
  	
  	
  "queijo":	
  "cheddar"	
  
}
Atualizar pedido: Resposta
HTTP/1.1	
  200	
  Ok	
  
Content-­‐type:	
  application/vnd.subway.sanduiche-­‐v1+json




{	
  
	
  	
  "id":	
  "1",	
  
	
  	
  "created_at":	
  "2013-­‐10-­‐23T05:02Z",	
  
	
  	
  "updated_at":	
  null,	
  
	
  	
  "pao":	
  "3	
  queijos",	
  
	
  	
  "queijo":	
  "cheddar",	
  
	
  	
  "recheio":	
  "club",	
  
	
  	
  "links":	
  [	
  
	
  	
  	
  	
  {	
  "rel":	
  "self",	
  "href":	
  "/pedidos/1"	
  },	
  
	
  	
  	
  	
  {	
  "rel":	
  "pagamento",	
  "href":	
  "/pagamentos/pedidos/1"	
  }	
  
	
  	
  ]	
  
}
Atualizar pedido: Erro
HTTP/1.1	
  409	
  Conflict	
  
Content-­‐type:	
  application/vnd.subway.sanduiche-­‐v1+json




{	
  
	
  	
  "id":	
  "1",	
  
	
  	
  "created_at":	
  "2013-­‐10-­‐23T05:02Z",	
  
	
  	
  "updated_at":	
  null,	
  
	
  	
  "pao":	
  "3	
  queijos",	
  
	
  	
  "queijo":	
  "suiço",	
  
	
  	
  "recheio":	
  "club",	
  
	
  	
  "links":	
  [	
  
	
  	
  	
  	
  {	
  "rel":	
  "self",	
  "href":	
  "/pedidos/1"	
  },	
  
	
  	
  	
  	
  {	
  "rel":	
  "pagamento",	
  "href":	
  "/pagamentos/pedidos/1"	
  }	
  
	
  	
  ]	
  
}
Como saber se é possível mudar o
pedido?
OPTIONS	
  /pedidos/1	
  HTTP/1.1

HTTP/1.1	
  200	
  Ok	
  
Allow:	
  GET,	
  PATCH
Pagar pedido: REQUISIÇÃO

•

Lembra do media type?

•

Utilizar relacionamentos
Pagar pedido: REQUISIÇÃO
GET	
  /pagamentos/pedidos/1	
  HTTP/1.1	
  
Accept:	
  application/vnd.subway.sanduiches-­‐v1+json




{	
  
	
  	
  	
  	
  "numero_cartao":	
  "123312",	
  
	
  	
  	
  	
  "expira_em":	
  "12/12",	
  
	
  	
  	
  	
  "valor":	
  "12.45"	
  
}
Ponto de vista do caixa: fila de
sanduíches
GET	
  /pedidos	
  HTTP/1.1	
  
Accept:	
  application/vnd.subway.sanduiches-­‐v1+json

{	
  
	
  	
  "total":	
  12,	
  
	
  	
  "page":	
  1,	
  
	
  	
  "per_page":	
  10,	
  
	
  	
  "items":	
  [	
  
	
  	
  	
  	
  {	
  "id":	
  “1”,	
  “status”:	
  "pago"	
  …	
  },	
  
	
  	
  	
  	
  {	
  "id":	
  “2”,	
  “status”,	
  “em	
  preparo"	
  …	
  }	
  
	
  	
  ]	
  
}
Listar pedido: media type
•

É necessário criar seu próprio media type?

•

Não! Já existem vários:
•

collection+json

•

atom+xml
Gems
roar

beer	
  =	
  Beer.new(:title	
  =>	
  "Lonestar	
  Beer")	
  
beer.post(order.links[:items])
jsonapi.org

•

Media type de propósito geral

•

Links, Coleções, etc
Obrigado :)
Referências
•

http://www.infoq.com/articles/webber-rest-workflow

•

http://www.enterpriseintegrationpatterns.com/ramblings/
18_starbucks.html

•

http://roy.gbiv.com/untangled/2008/rest-apis-must-behypertext-driven

•

http://github.com/apotonick/roar

•

http://github.com/intridea/grape

•

http://jsonapi.org

Mais conteúdo relacionado

Semelhante a REST APIs: Como projetar e implementar APIs RESTful

Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugSergio Azevedo
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduGuilherme
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkMario Guedes
 
Os 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulOs 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulKleber Bacili
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014Tiago Marchetti Dolphine
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Rodrigo Peleias
 
Deck apix 2017 design &amp; security - case cielo lio
Deck apix 2017   design &amp; security - case cielo lioDeck apix 2017   design &amp; security - case cielo lio
Deck apix 2017 design &amp; security - case cielo lioLuis Moraes Junior
 
Minicurso - Banco de Dados NoSQL com .Net Core
Minicurso - Banco de Dados NoSQL com .Net CoreMinicurso - Banco de Dados NoSQL com .Net Core
Minicurso - Banco de Dados NoSQL com .Net CoreBruno Roldão
 
Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web APIVinicius Mussak
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Luis Cipriani
 
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesPHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesiMasters
 
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoEvoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoRafael Portela
 
Boas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful APIBoas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful APIFernando Camargo
 
Modern Apps e o novo panorama de identidade e autenticação
Modern Apps e o novo panorama de identidade e autenticaçãoModern Apps e o novo panorama de identidade e autenticação
Modern Apps e o novo panorama de identidade e autenticaçãoJorge Tressino Rua
 
Express checkout PayPal
Express checkout PayPalExpress checkout PayPal
Express checkout PayPalJeff Prestes
 
Tony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics ArtifactsTony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics Artifactstonyrodrigues
 

Semelhante a REST APIs: Como projetar e implementar APIs RESTful (20)

Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
 
Introdução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos ReduIntrodução a plataforma de aplicativos Redu
Introdução a plataforma de aplicativos Redu
 
Conhecendo o Novo REST Framework
Conhecendo o Novo REST FrameworkConhecendo o Novo REST Framework
Conhecendo o Novo REST Framework
 
Aplicações web parte 1
Aplicações web parte 1Aplicações web parte 1
Aplicações web parte 1
 
Trabalho Web Services
Trabalho Web ServicesTrabalho Web Services
Trabalho Web Services
 
Curso AngularJS - Parte 1
Curso AngularJS - Parte 1Curso AngularJS - Parte 1
Curso AngularJS - Parte 1
 
Os 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTfulOs 7 Pecados Capitais na exposição de APIs RESTful
Os 7 Pecados Capitais na exposição de APIs RESTful
 
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014OAuth2: Uma abordagem para segurança de aplicações e APIs REST  - Devcamp 2014
OAuth2: Uma abordagem para segurança de aplicações e APIs REST - Devcamp 2014
 
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
Desenvolvimento de aplicações assíncronas, orientadas a eventos e poliglotas ...
 
Deck apix 2017 design &amp; security - case cielo lio
Deck apix 2017   design &amp; security - case cielo lioDeck apix 2017   design &amp; security - case cielo lio
Deck apix 2017 design &amp; security - case cielo lio
 
Minicurso - Banco de Dados NoSQL com .Net Core
Minicurso - Banco de Dados NoSQL com .Net CoreMinicurso - Banco de Dados NoSQL com .Net Core
Minicurso - Banco de Dados NoSQL com .Net Core
 
Introdução ao ASP .NET Web API
Introdução ao ASP .NET Web APIIntrodução ao ASP .NET Web API
Introdução ao ASP .NET Web API
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
 
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integraçõesPHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
PHP Experience 2016 - [Workshop] APIs bem desenhadas como base para integrações
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoEvoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
 
Boas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful APIBoas práticas no desenvolvimento de uma RESTful API
Boas práticas no desenvolvimento de uma RESTful API
 
Modern Apps e o novo panorama de identidade e autenticação
Modern Apps e o novo panorama de identidade e autenticaçãoModern Apps e o novo panorama de identidade e autenticação
Modern Apps e o novo panorama de identidade e autenticação
 
Express checkout PayPal
Express checkout PayPalExpress checkout PayPal
Express checkout PayPal
 
Tony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics ArtifactsTony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics Artifacts
 

Mais de Guilherme

Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoWhere Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoGuilherme
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled gardenGuilherme
 
Desafio de crescer
Desafio de crescerDesafio de crescer
Desafio de crescerGuilherme
 
Consumindo APIs REST com Ruby
Consumindo APIs REST com RubyConsumindo APIs REST com Ruby
Consumindo APIs REST com RubyGuilherme
 
Aplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsAplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsGuilherme
 
Aplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduAplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduGuilherme
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasGuilherme
 
FLOSS and Startups
FLOSS and StartupsFLOSS and Startups
FLOSS and StartupsGuilherme
 
Ruby 101 && Coding Dojo
Ruby 101 && Coding DojoRuby 101 && Coding Dojo
Ruby 101 && Coding DojoGuilherme
 
Dojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsDojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsGuilherme
 
CSS first steps
CSS first stepsCSS first steps
CSS first stepsGuilherme
 
How does the Web work?
How does the Web work?How does the Web work?
How does the Web work?Guilherme
 
0 introducao padroes_web
0 introducao padroes_web0 introducao padroes_web
0 introducao padroes_webGuilherme
 
Plano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasPlano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasGuilherme
 
Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Guilherme
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryGuilherme
 
3 padroes-web-intro-javascript
3 padroes-web-intro-javascript3 padroes-web-intro-javascript
3 padroes-web-intro-javascriptGuilherme
 
Desevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSDesevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSGuilherme
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLGuilherme
 

Mais de Guilherme (20)

Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu CódigoWhere Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
Where Does the Fat Goes? Utilizando Form Objects Para Simplificar seu Código
 
Redu walled garden
Redu walled gardenRedu walled garden
Redu walled garden
 
Desafio de crescer
Desafio de crescerDesafio de crescer
Desafio de crescer
 
Consumindo APIs REST com Ruby
Consumindo APIs REST com RubyConsumindo APIs REST com Ruby
Consumindo APIs REST com Ruby
 
Aplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com RailsAplicações tipo Canvas no Redu com Rails
Aplicações tipo Canvas no Redu com Rails
 
Aplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma ReduAplicações sociais usando a plataforma Redu
Aplicações sociais usando a plataforma Redu
 
Introdução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvasIntrodução aos aplicativos tipo canvas
Introdução aos aplicativos tipo canvas
 
FLOSS and Startups
FLOSS and StartupsFLOSS and Startups
FLOSS and Startups
 
Ruby 101 && Coding Dojo
Ruby 101 && Coding DojoRuby 101 && Coding Dojo
Ruby 101 && Coding Dojo
 
Dojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome StylesheetsDojo: Sass - Syntactically Awesome Stylesheets
Dojo: Sass - Syntactically Awesome Stylesheets
 
Sass
SassSass
Sass
 
CSS first steps
CSS first stepsCSS first steps
CSS first steps
 
How does the Web work?
How does the Web work?How does the Web work?
How does the Web work?
 
0 introducao padroes_web
0 introducao padroes_web0 introducao padroes_web
0 introducao padroes_web
 
Plano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu RespostasPlano de Pesquisa - Redu Respostas
Plano de Pesquisa - Redu Respostas
 
Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX Desevolvimento Web Client-side - AJAX
Desevolvimento Web Client-side - AJAX
 
Desevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQueryDesevolvimento Web Client-side - jQuery
Desevolvimento Web Client-side - jQuery
 
3 padroes-web-intro-javascript
3 padroes-web-intro-javascript3 padroes-web-intro-javascript
3 padroes-web-intro-javascript
 
Desevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSSDesevolvimento Web Client-side - CSS
Desevolvimento Web Client-side - CSS
 
Desevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTMLDesevolvimento Web Client-side - HTML
Desevolvimento Web Client-side - HTML
 

REST APIs: Como projetar e implementar APIs RESTful