SlideShare uma empresa Scribd logo
1 de 84
Baixar para ler offline
Construindo APIs
RESTful com Spring
E aí véi!
Mateus Malaquias
Senior Software Developer
@mmalaquiasdev
http://bit.ly/malaquiaslinkedin
▣ https://soujava.org.br
▣ https://twitter.com/soujava
▣ http://bit.ly/soujava-youtube
▣ https://medium.com/collabcode
▣ https://twitter.com/collabcodetech
▣ https://www.facebook.com/collabcode
AGENDA
▣ URI
▣ Recursos
▣ Verbos HTTP
▣ Status Code
▣ Media Types
▣ Filtros e paginação
▣ Caching
▣ Versionamento
▣ Documentação
▣ Modelo de Maturidade de
Richardson (HATEOAS)
1.
Um breve
contexto
Antes de qualquer
coisa precisamos
entenderalgumas
coisas…
O termo é REST ou RESTful?
▣ Rest é um estilo arquitetural
que foi criado por Roy
Fielding.
▣ RESTful é o design dos
contratos de APIs que
respeita os conceitos REST.
REST vs SOAP
Spring MVC
▣ É um action Web MVC framework que é suportado pelo Spring
Boot e os convencionais servidores Java.
▣ É muito utilizado para implementação de aplicações Web ou
para REST APIs.
▣ Ele possui uma implementação do pattern FrontController que
basicamente é responsável por receber todas as requisições,
delega-las para os respectivos controllers e retornar a devida
resposta.
‘’
Qual a diferença entre MVC action
based e component based?
Leia mais:
http://bit.ly/actionoucomponent
2.
URI
Uniform Resource
Identifier
Estrutura básica [ 1 ]
https://api.twitter.com/1.1/search
Seu domínio
HTTPS
ou
HTTP
Recursos e
Parâmetros
Versão da API
(opcional)
Estrutura básica [ 2 ]
https://api.fcamara.com.br/vagas/curriculos
Seu domínio
HTTPS
ou
HTTP
Recursos e
Parâmetros
Nome da API
(opcional)
‘’
▣ Identificador de Recursos Universal,
como diz o próprio nome, é o
identificador do recurso. Pode ser
uma imagem, uma página, etc, pois
tudo o que está disponível na
internet precisa de um identificador
único para que não seja confundido.
▣ Leia mais: http://bit.ly/urlvsuri
3.
Recursos
Utilize substantivos,
evite verbos e não use
nome de funções
Coleção e elemento
…/vagas/criarCurriculo
…/vagas/getTodosCurriculos
Coleção e elemento
…/vagas/curriculos
…/vagas/curriculos/29
Sub-elementos
…/vagas/curriculos/29/certificados/2
‘’
▣ Ao usar sub-elementos tenha
um cuidado a mais para para
evitar encadeamentos, pois
pode de dificultar a evolução da
API.
Encadeamento de sub-elementos
…/29/certificados/2/servidores
…/29/certificados/2/servidores/892
4.
Verbos HTTP
O mínimo que você
precisa saber sobre:
GET, POST, PUT,
DELETE...PATCH e
OPTIONS.
GET: Um método de consulta
▣ Cacheável
GET …/usuarios
GET …/usuarios/301
POST: Um método para criação
▣ Não é Cacheável
▣ Informações são transitadas no corpo da requisição
POST …/usuarios
{
"username": "Malaquias",
"password": "123456",
"city": "Salvador",
"interests": "Java"
}
PUT: Um método para atualização
▣ Não é Cacheável
▣ Informações são transitadas no corpo da requisição
PUT …/usuarios/301
{
"username": "Malaquias",
"password": "123456",
"city": “São Paulo",
"interests": "Java"
}
DELETE: Um método para remoção
▣ Não é Cacheável
DELETE …/usuarios
DELETE …/usuarios/301
PATCH: Um método para atualização parcial
▣ Não é Cacheável
PATCH …/usuarios/301
{
"password": “ab21ac2",
}
OPTIONS: Quais verbos posso usar?
OPTIONS …/usuariosHTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Date: Thu, 13 Oct 2016 11:45:00 GMT
Expires: Thu, 20 Oct 2016 11:45:00 GMT
Server: EOS (lax004/2813)
x-ec-custom-error: 1
Content-Length: 0
DEMO
5.
Status Code 200, 400 ou 500?
As familias mais utilizadas
4xx2xx 5xx
Tá tudo bem O cliente fez
algo que eu
não entendi
Ops! Quebrei
As vezes você se depara com isso...
POST …/usuarios
HTTP/1.1 200 OK
{
"codigo":"-99",
"msg":"Error interno"
}
A familia 200
2xx
Tá tudo bem
Status: 200 OK
GET …/usuarios
[
{
"id":"421524",
"nome":"Mateus",
"senha":"123456",
"email":"mateusmalaquiasdev@outlook.com"
},
...
]
Status: 201 Created
OU
{
"telefone":"11999999999"
}
HTTP/1.1 201 Created
Location: …/usuarios/421524/telefones
POST …/usuarios/421524/telefones
Status: 202 Accepted
{
"href":"/usuarios/421524/documentos/2130040"
}
POST …/usuarios/421524/documentos
A familia 400
4xx
O cliente fez
algo que eu
não entendi
Status: 400 Bad Request
POST …/usuarios
{
"status":400,
"msg":"Nome do usuário não pode ser nulo ou vazio",
"doc":"https://api.fcamara.com.br/erros/nome-usuario"
}
Status: 404 Not Found
GET …/usuarios/64721
{
"status":404,
"msg":“Usuário não foi encontrado",
"doc":"https://api.fcamara.com.br/erros/usuario-nao-existe"
}
Os mais utilizados
401 Unauthorized
403 Forbidden
404 Not Found
429 Too Many Requests
A familia 500
5xx
Ops! Quebrei
Status: 500 Internal Server Error
POST …/usuarios
{
"status": 500,
"msg": "Ops! Aconteceu um erro um interno“
}
‘’
▣ Lista completa de status
https://httpstatuses.com/
DEMO
6.
Media Types
Basicamente
trabalhamos
com um tipo
JSON vs XML
E no Header como é que fica?
OPTIONS …/usuarios
HTTP/1.1 200 OK
Server: Apache/2.0.61 (Unix)
Accept: application/json
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 0
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: application/json
7.
Filtros e paginação Tudo tem um limite
Filtros com escopo
GET …/usuarios?status=ativos&nome=Ma
Filtros com respostas parciais
GET …/usuarios/1?fields=nome,email
‘’
▣ Gosto de pensar no Graphql
como uma forma de
desenvolver uma API orientado
a tipos, pois tudo no Graphql se
resume a tipos e resolvers.
▣ Leia mais: http://bit.ly/2uU0eSb
Paginação das suas coleções
GET …/usuarios?page=10&size=50
Quem controla o limit é a API
GET …/usuarios?page=5&size=500
DEMO
8.
Caching
Evite uma super
lotação
Fazer caching é uma boa prática!
▣ Vamos evitar tráfego
▣ Diminuir a latência de rede
▣ Evitar que nossos servidores fiquem
sobrecarregados
Mas temos que ter cuidado com...
▣ O tempo que vamos invalidar o cache
▣ Se alguma ação vai invalidar o cache
▣ Faz clusters? Como sincronizar o cache?
DEMO
9.
Versionamento
Eu prefiro ser essa
metamorfose
ambulante
As coisas mudam
Dificilmente uma API será completamente estável, mudanças são
sempre inevitáveis, então é importante para o seu negócio que
você consiga caminhar sem quebrar.
Voltamos a estrutura básica [ 1 ]
https://api.twitter.com/1.1/search
Versão da API
(opcional)
Quando uma versão muda?
https://api.twitter.com/1.2/search
Quando uma versão muda?
https://api.twitter.com/2.0/search
10.
Documentação
O guia dos
mochileiros das APIs
Uma boa documentação tem...
▣ Descrição, tutoriais de uso e exemplos
▣ Ela pode ou não ser interativa
▣ Está sempre atualizada
▣ Quando se tem muitas APIs, um catalogo é
uma opção interessante de se ter
Swagger
▣ Modelagem da API
▣ Geração de documentação (legível) da API
▣ Geração de códigos do Cliente e do Servidor, com suporte a
várias linguagens de programação
▣ No Java usamos anotações para gerar a documentação
O Swagger é um projeto composto por algumas ferramentas que
auxiliam o desenvolvedor de APIs REST
DEMO
11.
Modelo de
Maturidade de
Richardson
(HATEOAS)
Em busca da glória do
REST
Nível 0 - POX
HTTP URI OPERAÇÃO
GET /getUsuarios/1 Retorna
POST /criarUsuarios Cria
POST /atualizarUsuarios/1 Atualiza
POST /deleteUsuarios/1 Deleta
É o nível mais baixo de uma API RESTful, aqui não se usa padrão
para praticamente nada.
Nível 1 – Recursos [ 1 ]
HTTP URI OPERAÇÃO
GET usuarios/1/buscar Retorna
POST usuarios/criar Cria
POST usuarios/1/atualizar Atualiza
POST usuarios/1/deletar Deleta
Se usa pelo menos os recursos como uma forma de modelar e
organizar APIs.
Nível 1 – Recursos [ 2 ]
HTTP URI OPERAÇÃO
GET usuarios/1 Retorna
POST usuarios Cria
PUT usuarios/1 Atualiza
DELETE usuarios/1 Deleta
Se usa pelo menos os recursos como uma forma de modelar e
organizar APIs.
Nível 2 – Verbos HTTP
HTTP URI OPERAÇÃO STATUS
GET usuarios/1 Retorna 200, 400, 500
POST usuarios Cria 200, 400, 500
PUT usuarios/1 Atualiza 200, 400, 500
DELETE usuarios/1 Deleta 200, 400, 500
Aqui já se utiliza os verbos HTTP e os STATUS code na execução
de uma operação.
Nível 2 – Hypermedia
Tem como elemento principal a representação hypermedia,
permitindo que um documento descreva seu estado atual, e o
seu relacionamento com outros elementos ou futuros estados.
Link de exemplo: https://pokeapi.co/
OBRIGADO
POR NÃO
DORMIR!
Perguntas?
@mmalaquiasdev
mateusmalaquiasdev@outlook.com

Mais conteúdo relacionado

Mais procurados

Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkFlávio Lisboa
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFRafael Ponte
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Thyago Maia
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFRafael Ponte
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHPAdler Medrado
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Thyago Maia
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Eduardo Mendes
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDB
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDBFlask Full Stack - Desenvolvendo um CMS com Flask e MongoDB
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDBBruno Rocha
 
Desenvolvimento de Módulos Divi Builder
Desenvolvimento de Módulos Divi BuilderDesenvolvimento de Módulos Divi Builder
Desenvolvimento de Módulos Divi BuilderDaniel Paz
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2Cezar Souza
 
Criando websites a jato com Django
Criando websites a jato com DjangoCriando websites a jato com Django
Criando websites a jato com DjangoMarcos Petry
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Webantonio sérgio nogueira
 

Mais procurados (20)

JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 
Pense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend FrameworkPense no futuro: PHP com Zend Framework
Pense no futuro: PHP com Zend Framework
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Os 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSFOs 10 maus hábitos dos desenvolvedores JSF
Os 10 maus hábitos dos desenvolvedores JSF
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 4 - 2019.1
 
Desafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSFDesafios de um desenvolvedor JSF
Desafios de um desenvolvedor JSF
 
Web 2.0 e RIA com PHP
Web 2.0 e RIA com PHPWeb 2.0 e RIA com PHP
Web 2.0 e RIA com PHP
 
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
Desenvolvimento de Sistemas Web com PHP Frameworks - Aula 2
 
Webservices
WebservicesWebservices
Webservices
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Introdução APIs RESTful
Introdução APIs RESTfulIntrodução APIs RESTful
Introdução APIs RESTful
 
Curso de JSP
Curso de JSPCurso de JSP
Curso de JSP
 
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDB
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDBFlask Full Stack - Desenvolvendo um CMS com Flask e MongoDB
Flask Full Stack - Desenvolvendo um CMS com Flask e MongoDB
 
Desenvolvimento de Módulos Divi Builder
Desenvolvimento de Módulos Divi BuilderDesenvolvimento de Módulos Divi Builder
Desenvolvimento de Módulos Divi Builder
 
Começando com Zend Framework 2
Começando com Zend Framework 2Começando com Zend Framework 2
Começando com Zend Framework 2
 
Criando websites a jato com Django
Criando websites a jato com DjangoCriando websites a jato com Django
Criando websites a jato com Django
 
Java Web Fácil com VRaptor
Java Web Fácil com VRaptorJava Web Fácil com VRaptor
Java Web Fácil com VRaptor
 
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação WebDjango Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
Django Módulo Básico Parte I - Desenvolvimento de uma aplicação Web
 

Semelhante a Construindo APIs RESTful com Spring

Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSPledsifes
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 
Rest Java One
Rest Java OneRest Java One
Rest Java OneDextra
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para issoJunior Conte
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]Igor Santos
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito CertoRavan Scafi
 
Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-endIgor Santos
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...BrunoSouza617
 
O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]Filipe Ximenes
 
Java Web Dev Introdução
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev IntroduçãoMarcio Marinho
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0jesuinoPower
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Thyago Maia
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterEric Silva
 

Semelhante a Construindo APIs RESTful com Spring (20)

Introdução à Servlets e JSP
Introdução à Servlets e JSPIntrodução à Servlets e JSP
Introdução à Servlets e JSP
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 
Rest workshop
Rest workshopRest workshop
Rest workshop
 
Rest Java One
Rest Java OneRest Java One
Rest Java One
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para isso
 
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
REST-fuuuu - Boas práticas RESTful [PHPeste 2017]
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito Certo
 
Design de APIs REST
Design de APIs RESTDesign de APIs REST
Design de APIs REST
 
Rest fuuuu front-end
Rest fuuuu front-endRest fuuuu front-end
Rest fuuuu front-end
 
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
Symfony Live - São Paulo 2019 - Como construir uma API em um passo com API Pl...
 
O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]O que é esse tal de rest? [PyBR2016]
O que é esse tal de rest? [PyBR2016]
 
Java Web Dev Introdução
Java Web Dev IntroduçãoJava Web Dev Introdução
Java Web Dev Introdução
 
Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0Novidades do JAX-RS 2.0
Novidades do JAX-RS 2.0
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1Desenvolvimento de sistemas web com php Frameworks - Aula 1
Desenvolvimento de sistemas web com php Frameworks - Aula 1
 
CEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniterCEPUG 2 - Bem-vindo a Framework CodeIgniter
CEPUG 2 - Bem-vindo a Framework CodeIgniter
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
Web Services
Web ServicesWeb Services
Web Services
 
Web Sphere
Web SphereWeb Sphere
Web Sphere
 

Construindo APIs RESTful com Spring