View
216
Download
0
Embed Size (px)
Citation preview
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
1/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
2/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
3/44
D> E > "
E>W= D
1^ ETS, 11/02/2016
] 2016 A= T $.
.
&> = K > > =>, > =Y >R, > >S
A= > Z P=.
A= T $
HHH.=H
@=H
+55 (11) 2626-9415
- !
http://www.youtube.com/subscription_center?add_user=algaworkshttp://www.youtube.com/subscription_center?add_user=algaworkshttps://www.facebook.com/algaworkshttps://www.facebook.com/algaworks
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
4/44
E>W= D A= > CV
C>TS, E= > T
>TS TZ C"
$C-1. = X
H $ E
H. A >U> >
CV C>TS > >TS > =R.
$=
https://www.linkedin.com/in/emiliodiashttps://www.linkedin.com/in/emiliodias
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
5/44
A >T...A V > = =, > =>
> V, > I= > [. > =P?
C> ?
D , U > >> P [. E >
=> =>, > =K> S K
> = =, =,
= = A= [ S =TS
G= > X >, > >TS U V
C> " F >=
=? V => [ = =>
S >= XI> TS, > =K V >
K.
E > ->= =@=H.
http://alga.works/comunidadejava/mailto:[email protected]:[email protected]://alga.works/comunidadejava/
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
6/44
A =
E > = (>> , > ) P > =, ,
X K > > =.
A = = > >U> >
>TS ". C>= F< H!
https://twitter.com/intent/tweet?text=Estou%20lendo%20o%20livreto%20gratuito%20de%20REST%20com%20Java%20da%20@algaworks.%20Imperd%C3%ADvel!&url=http://alga.works/livreto-desmistificando-rest-com-java/&original_referer=http://alga.works/livreto-desmistificando-rest-com-java/https://twitter.com/intent/tweet?text=Estou%20lendo%20o%20livreto%20gratuito%20de%20REST%20com%20Java%20da%20@algaworks.%20Imperd%C3%ADvel!&url=http://alga.works/livreto-desmistificando-rest-com-java/&original_referer=http://alga.works/livreto-desmistificando-rest-com-java/https://www.facebook.com/dialog/feed?app_id=1416943265272445&link=http://alga.works/livreto-desmistificando-rest-com-java/&redirect_uri=http://alga.works/livreto-desmistificando-rest-com-java/https://www.facebook.com/dialog/feed?app_id=1416943265272445&link=http://alga.works/livreto-desmistificando-rest-com-java/&redirect_uri=http://alga.works/livreto-desmistificando-rest-com-java/
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
7/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
8/44
>P
TS
E
C=- .......................................................................................... 13
= ....................................................................................................... 14
C ............................................................................................................15
> ..................................................................................... 16
> > > .................................................................................. 17
CX > .................................................................................17
O E E=?
E= > ........................................................................ 18
...................................................................................................... 19
%U ....................................................................................................... 24
E 'A
%= >
&W= 0 - ' ..............................................................................................32
&W= 1 - ...................................................................................... 34
&W= 2 - .............................................................................. 35
&W= 3 - AE'A ................................................................................... 36
1
2
2.1
2.2
2.3
2.4
2.5
2.6
3
3.1
3.2
3.3
4
5
5.1
5.2
5.3
5.4
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
9/44
C=S6
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
10/44
CW= 1
TSV > P = > E=, S U>>?
% > = > TS > >,
= >X . % = >= > =K
TS?
& =, > P > U [
> > >=> > E= > " >.
V P > ? E U > S
> = P , > .
>>, > > > H P
> => > K = >>. & ,
> > > =TS >>. ' U U > > , = =, >
X.
A > = > > > > > =
=> > >. & [=> , >
> > > , >, =,
C, . ' > =,
>> > .
HHH.=H 10
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
11/44
' > = > , =>
>, >, > > U
>= >= > =TS P >=I.
A=> U W= >> > > > = >U>
ITS > >.
C> > I> K > > IV
T, >, I>=, > > > > -
>> W= >> > > = W, > =>
>. E IV U
> > > >== >=.
C> V > =X, X = > Q =TZ
>. A=U> , A (A= >> ) >
` =Ia X >,
> > = = I > X.
G > > H==, H, G= F< >
> > >= >= >
> > =TZ . ' , = > => >( ), =K > > >
> T.
DK , > P= = > =
S P > U, > >U>
> = > > P >
IV K >=.
A=U> , P =K> => >
>= > , =S S >
> => > = > >
K .
A >=W > = > S
>=> > > K > >
. S S > A ? E= P
HHH.=H 11
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
12/44
W >> A > =
>. A =>, >:
\ >=
\ EIW=\ E=P=
\ >=
\ G==
\ E > >_
W> > => > >S. EI, >
I S > > = > >
>TZ S P S =K, >>T P-= > > => W
=TZ K >=.
B , = X > > >= =
E " > >=>TS =TZ >
. > = >U> > E,
=> [ Z > >
U .
HHH.=H 12
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
13/44
CW= 2
EA > > , E W 2000, .D > > J F=1.
' = >=KTS > >= P
> constraints. E constraints > > >
> = Z > > >=,
= >>.
> > >= contraints?
2.1. C=-
A = W constraint U =
> >. E S >,
I>= > > TS >> >K>
back-end =TS.
' S > >> P P back-end.
> =TS == = >
. A=> P > > >=, >H A=" A E= >> => > =
> =.
1. ://HHH.../N=/
HHH.=H 13
http://www.ics.uci.edu/~fielding/http://www.ics.uci.edu/~fielding/
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
14/44
2.2. =
E W Z TS S =TS
> TZ , , TS
>TZ P = > = .
' = >=, U>, U > >> cookies
>K> Z = . E >
> =, >> .
> cookies U =KTS >
> P > = > = =TZ. A
I = > >= TS.
= > >> ,=> > Z = =, == . EI>
P > S, I>=, > >=
Sticky Session2 > > P >=, > > W=,
= >K> >TZ =.
2. ://..//2.2/>/>IJ=.>=
HHH.=H 14
http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.htmlhttp://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
15/44
F=, =K > >= >TS stateless , A
W > =, = ==.
> > , > W=, = U =>
> S > >TS .
2.3. C
> >= >, > > E >
> W cache. C => >
> = => >P ( proxies , gateways /
= ) = =W cache > .
' = > > constraint
TS headers `Ia (S 1.0 ) / `-=a
(S 1.1 ).
> TZ = == = cache , S
> > >
HHH.=H 15
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
16/44
TS. E >= > I
=> S P.
2.4. >
C> > U , > E > U
W, > > U > > >.
B T > >
>= = Z >. = >
, => I > :
\
\ %
\ Hypermedia
>=> =K , > A = > TS
>U> =KTS >U X . &X >
>= > Z .
> > = > , >
I>= > > >= > > ->>. >
= = , > I>= , =,
. D> > > > >=TS
. AI > I>=:
>= `=a > U TZ >
I >>. F> > > >=>
V P > TZ = >>U = .
HHH.=H 16
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
17/44
2.5. > > >
C> > == P >
W, > > E =>
>P > => =.
=> >P S =K >
=. U = =, > V
G= > > >> D&, > V
> S K > cache. =K > S
U .
X > stateless cache , =K >=> > > =. E = U >
=> > > > >
> =TS, > = T.
2.6. CX >
V > P > U =
P => H TS . A >
= => S I=, U
> H = > >>.
CX > > = >=, = = =
> =. EI>= S "
A=.
HHH.=H 17
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
18/44
CW= 3
O E E=?V P T > E E=,S U? &S , > S > >> U >P=
>. % , > A =TS > E
E=?
D > > , U V K A E=. A=U> , U
> V V >= = >>
>.
> >= W X
> >, V =K > E, P >> >
V = > >=>TS >>
W, V E=.
A S = S =, = K
V > =K >= . >U> I
= E > U > P.
3.1. E= >
AU , X > W > > =
. A S > > =KTS
, > > > > P.
HHH.=H 18
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
19/44
> > > =K >=>TS E:
= . > = >U> =
TS > A E=. ' S U = =
W, > > = W V
>=> > E=.
3.2.
> U =K > [ >
W. A FC 3986 => W >
.
B>, > >=> > > , U
, > U => =K > A. EI>=:
/cliente/1
/produto/1
/cliente/1/notificacao
> =K > > , S > > TS I > . A= = > =KTS
> W, U>, S U => P= V
> =.
> = V, > > = > >
W . &S > > = >H U = > S >= > >=>TS
=.
@RestController
@RequestMapping("/cliente")
public class ClienteResource {
@RequestMapping(value = "/{id}", method = RequestMethod.GET,
produces = "application/json")
public ClienteRepresentation buscar(@PathVariable("id") Integer id) {
System.out.println("Retornando cliente...");return new ClienteRepresentation("João da Silva");
HHH.=H 19
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
20/44
}
}
A >=, X > =K => W
TS > . ' = > = U:
A TS @RestController > = =K >
= > W > E.
A TS @RequestMapping = ClienteResource > =
P > . O >> > >=
P > > >.
"P TS @RequestMapping >U buscar , > =>
. A > U >> > {id}. >
= W value > =, > >
= >> `/=/LMa. O
>U> T produces , > TS
= > > "'&.
EI , > > = >= :
{
"nome": "Joao da Silva"
}
U > >= >TS > > "'& (=> "'&
), > P > >T =.
V = `TSa > >> . O > V >
>= = V >.
> U = > = (I: H), I
> U > >> =. E >>
U > TS > > . A >> S
> = => > >,
> I>=, > = .
HHH.=H 20
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
21/44
TZ
A TZ > >= > P >, > %$, "'&,
%$ . V = > TS >
=KTS hypermedia (> X >
).
> > =, > I>= `/=/1a,
> >. &= , X > > TS >
> "'&, > X W> >U> P-= >
>>.
>[== TZ (> > TS [) .
W=, V header `Aa = U
TS > . A I I > > =.
& > , >
> > TS .
A > K > P S > "'& %$, S
> =K > A =, V =>
[ =.
HHH.=H 21
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
22/44
%$
' %$ ( % => >TS
> = 3C (= C>) > >
TS = .
E= U =K > > > S >TZ >
U >> >K> >>. AI, >
> > %$:
10
Alan Turing23/06/1912
Matemático
Manchester
Inglaterra
& >TS %$ U > > > P, > > = > > > >= => >
> ".
> %$ U .
TS >TS, > P ,
K > overhead P.
B , > =K > =TS > I, >
.
"'&
' "'& (" ' &) > > =
TS > > > >= =.
HHH.=H 22
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
23/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
24/44
3.3. %U
A FC 72313 > 8 >U > =K
TS > A E=. E >U >R
TZ W > > > .
D 8 >U, I > => 4 > .
GE
' >U GET U =K I > .
E= U >, , K U I > , = > P >>. EI>=:
GET /cliente/1 HTTP/1.1
E > P > TS `/=/1a.
'
=K TS > > TS.
EI>=:
POST /cliente HTTP/1.1
João da Silva
...
' >U PUT U =K > > =K > > . E>
= P > W, = >U> =K > >
TS, I>= = > =
=K.
3. ://HHH..//3986.I
HHH.=H 24
https://www.ietf.org/rfc/rfc3986.txthttps://www.ietf.org/rfc/rfc3986.txt
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
25/44
DE$EE
' = > > = >TS > > . EI>=:
DELETE /cliente/1 HTTP/1.1
A > >U =K> > CD
(Create, Read, Update Delete) >=TS , = S
> > > > >U
> >U> > TS >R > >
.
> > >=, = TZ > > =. > > = > >
.
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE,
produces = "application/json")
public void excluir(@PathVariable("id") Integer id) {
System.out.println("Excluindo o cliente...");
}
>> X > > I>= > S
, > =. B>
>> , >U method , = TS
> > I I=S > > .
D >, TS DELETE HTTP P
> >U excluir.
A=U> >U, > > TS,
> TS. I > >
= .
\ 1II - >TZ
\ 2II -
\ 3II - >
\ 4II - E =\ 5II - E
HHH.=H 25
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
26/44
> >, I> X W >
= > > TZ >=TS .
' > U > => >
X . > > U TS >RuntimeException , > X = U >
TS. > I>=:
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
}
T TS ResponseStatus. E= > > =
X ITS =T. & , >X 404 (Not Found) P , > = S
.
V > = > =T ITS.
ES > X I>= I:
@RequestMapping(value = "/{id}", method = RequestMethod.GET,
produces = "application/json")public ClienteRepresentation buscar(HttpServletResponse response,
@PathVariable("id") Integer id) {
System.out.println("Cliente não encontrado...");
throw new ResourceNotFoundException();
}
=KTS ITS >> > V P
=.
A > =K X > >=, > U =
> U P TS => >
E=. '>, I> [> =, >
V P >T =K > .
A=U> > U ,
> > [ >=> > A E=.
D =, - web linking , TS [, queries , caching ,
HHH.=H 26
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
27/44
TZ T. C> > = >
W.
A > >=>TS , [>
>H =K. V P = > " EE =, V >U>
TS "A-. E= > >> =
> , I > W> .
HHH.=H 27
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
28/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
29/44
A S U > > >> =K "'&. &
, > > >> >= = (C), > >
>> .
=K V > [ U = C.
' C U > >= > T> =KTS >U
ITS > >.
> I>=, > = " >U, C U >
>= =KTS >U ITS >
> ( >)4.
' 'A U >, , = IZ > U >U "
( =>), = > I > >
> %$.
D , U P = = E 'A
> =U> > > S >. E
> = > > >= =. O
P =KTS > >= > W E?' >= C, >=> = 'A > > U
TZ > -*, U > ?
' = > TS S W >
W. A U >= E I > >
> P > = > TS.
$>- S I > >= “One size fits all” , , E
'A S U = =TS =>.
% S P = A > E= >
`W=a > > =, , = > >
W P > => E=.
4. > DW, W >. AH . >
HHH.=H 29
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
30/44
C> > > S, >
`%= % a5 XI> W=, > >
X > > W= > A = =>
E=.
5. ://>H=.>/=/%J%=.>=
HHH.=H 30
http://martinfowler.com/articles/richardsonMaturityModel.htmlhttp://martinfowler.com/articles/richardsonMaturityModel.html
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
31/44
CW= 5
%= >
A J F= I = > A
E= = > constraints >
=6 , > >, K hypermedia , P, > K
> > > > > >=.
E > E, > >TS
> A E= = => S constraints
F=.
A , > > > =, >
> = >, > >= > .
' >= $ 7 > 4 W
> W A > = >
> >.
' W 0, 1 2 =K > > >= V, S >
P >=>, U>, = V >> S S
E=. & I > S W:
6. ://J..>/=/2008/>JI7. ://HHH.>>J.>/=/
HHH.=H 31
http://roy.gbiv.com/untangled/2008/rest%C2%ADapis%C2%ADmust%C2%ADbe%C2%ADhypertext%C2%ADdrivenhttp://www.crummy.com/self/http://www.crummy.com/self/http://roy.gbiv.com/untangled/2008/rest%C2%ADapis%C2%ADmust%C2%ADbe%C2%ADhypertext%C2%ADdriven
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
32/44
%= > F: ://>H=.>/=/%J%=.>=
5.1. &W= 0 - '
V > P = > => = > A
>= . A W= > E Z, > A > E= > W=
>. & P, = U =K >
>> V U > >= = >
> C.
& W=, > > =K > > > %$, "'&
. O > =>, > >, S U >
>> S > > E. I > I>= A > W= 0:
POST /salvarCliente HTTP/1.1
João da Silva
...
A =KTS > POST HTTP TS > , S P >= > . C> P ,
HHH.=H 32
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
33/44
> >= > . I > =
> > > C > E.
RPC (POX)
Verbo HTTP URI Ação
GE /C=/1 =K
' /=C= C
' /=C=/1 A=
GE/' /=C=/1 >
REST
Verbo HTTP URI Ação
GE /=/1 =K
' /= C
/=/1 A=
DE$EE /=/1 >
& = > =K T >=>
> > =K > .
> => > , U >=TS
X . CX > S >
>= > = =TS, > =>
gateway proxy => > . > I>=:
GET /buscarCliente/1 HTTP/1.1
HTTP/1.1 200 OK
HHH.=H 33
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
34/44
CLIENTE NÃO ENCONTRADO
404
A >> = = S ,
> >TS => (200 '#), ,
I > T >R = TS
= =TS.
5.2. &W= 1 -
%= > ' > IZ> = >U> (C). E >= > K U >
TS => = , =
> = > >U
> P-=.
> > > TS E U >=>
=KTS >> TS > > A.
> I>= > W= > :
POST /cliente HTTP/1.1
João da Silva
...
E X U > >= > S , > U> >=> `C=a.
%= > , > >U
> , TZ P >
. O > XI> S.
HHH.=H 34
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
35/44
5.3. &W= 2 -
& W=, I I > =
I > = >R A, , > =K
> X = > .
A =KTS >U > (GET, POST, PUT DELETE), >
> X , >> >=>
TS > > > A.
C `=a I>= , I
>=> > A W= 3 >.
C > =:
POST /cliente HTTP/1.1
João da Silva
...
V : A >> > S U = S? >, = T? A >> TS
>= >, P >U>
> >> = = , >
I:
HTTP/1.1 201 Created
Location: /cliente/1
O > 2 : ' > U =KTS
`201 Ca. C> = TS > , >
> > > .
A=U> , > > U T header ̀ $a. E header
> > = T W=.
C> T header `$a (/=/1), X >
K :
HHH.=H 35
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
36/44
GET /cliente/1 HTTP/1.1
HTTP/1.1 200 OK
1
João da Silva
...
C> `/=/1a, =K >
(GET ) > `200 '#a >
> >> >>.
C P >TS , V =K >UDELETE , > > I:
DELETE /cliente/1 HTTP/1.1
A >>, P > >
>> > .
5.4. &W= 3 - AE'A
E W= U > > [ = E. EI >
U => AE'A (Hypermedia as the
Engine of Application State) = = > > A.
E> = =, F= I > = A S =K>
AE'A S > E=, >> >, V > [ E > >
W.
A > = S > >=, AE'A U >
P . E= > > =>
= > TS hypermedia , > > >
= => > .
A I > >= .
HHH.=H 36
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
37/44
> > U =TS
>> P > . ' > U =K >
TS > U = (I:
> P %$).
A >> K > > X %$ (Hypermedia Text Markup
Language), > =. I>=, >
[ index.html:
Produtos
ClientesContato
Carrinho
& X %$ >, > T , K =
%$ (>=> > H) = I > GET >
href.
HHH.=H 37
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
38/44
C> > > , H P
K > GET ? P = TS %$ K
K > , > >> GET Q
href , , I > U- H
.
C>T> S > >= AE'A.
C> X > , TS hypermedia = > >
> , > = > >>. C U
> > (> P %$) V (
= > > = X > > ( V, `a). ' >> P = = > , > > > > .
>, > %$ U > => >
=TZ > W >= AE'A. U>, >
>=> > A = >> >? E =
W >?
=> > = > > W
>=, X > P >
=KTS = (H). ' => ,
=> hypermedia %$, > > = ,
= => [ =
, , S , > =
P > > > > =>
=, > H, proxies , gateways , = .
C >> > A, V
A => = > = >
=KTZ = =.
V P > > > = > >
> P > KTS? "P > >
> >= P, > > T > ?
HHH.=H 38
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
39/44
C A E= A > > constraints
= AE'A. C> , V P =
=T W >, A => =P,
IW > W .
C A > > > = >
W U > > , >= >= =K >
=TZ S > >= C.
& =, S > = > > TS
= A E=, > P I > > > = >
> = > W.
I>=, I > TS > A
=K hypermedia:
GET /cliente/1 HTTP/1.1
HTTP/1.1 200 OK
1
João da Silva
& I>= >, > > `/=/1a. '
> TS W TZ
> =K.
O = =, >S (/=/1), U>, `=a > = `=a, >
> >R , , = =K >U DELETE
.
C> >, = A P
=> `=a `a = >
> =
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
40/44
A >=> > A > hypermedia =
TS = >= => =K. C A
W = > =, U>, =
Z > =K, > X %$, A'% B U >>
TS > => X.
>> TS I>= > > >= C,
> > = A =
> W TZ, > > C > 'A,
V > TZ = >>
> =.
D , > TS A > >= S U > S =, V >.
A> A== , > =
> .
HHH.=H 40
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
41/44
CW= 6
C=SC> = = > =K V > >!
=K V > > U V
. =>, I> P > S K>
>=> > X P E. , U > V
= > P.
% => > = >
P = > A E=.
&S => S > > =. =>,
= S W >= =>, U>, T >
>> > V X A=
= [ >, V
>=> >= > W= =.
D > >, V :
\ C> > > > > =
\ C> > K >=
\ CW =TZ
b >=
b EIW=
b E=P=
b E_\ DT E E=
HHH.=H 41
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
42/44
\ ' > A E= A
\ DT 'A E
\ E > >_
E = W > >! ;)
HHH.=H 42
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
43/44
8/18/2019 Algaworks Livreto Desmistificando Rest Com Java 1a Edicao
44/44