218
Arquitetura: chega de mesmice Guilherme Silveira Tuesday, October 12, 2010

Arquitetura: chega de mesmice

Embed Size (px)

DESCRIPTION

Palestra sobre arquitetura de sistemas distribuídos e integração entre sistemas que não possuiam previsão.

Citation preview

Page 1: Arquitetura: chega de mesmice

Arquitetura: chega de mesmiceGuilherme Silveira

Tuesday, October 12, 2010

Page 3: Arquitetura: chega de mesmice

são paulo

Tuesday, October 12, 2010

Page 4: Arquitetura: chega de mesmice

são paulo

Tuesday, October 12, 2010

Page 5: Arquitetura: chega de mesmice

são paulo

Tuesday, October 12, 2010

Page 6: Arquitetura: chega de mesmice

são paulo

Tuesday, October 12, 2010

Page 7: Arquitetura: chega de mesmice

são paulo

Tuesday, October 12, 2010

Page 8: Arquitetura: chega de mesmice

Guilherme [email protected]

2002 guj.com.br2003 vraptor2004 caelum.com.br xp, xstream2006 scrum2009 restfulie, lean2010 tectura.com.br

Tuesday, October 12, 2010

Page 9: Arquitetura: chega de mesmice

calendar.com

travel.com company.com

bank.com

Tuesday, October 12, 2010

Page 10: Arquitetura: chega de mesmice

CORBAheaven?

Tuesday, October 12, 2010

Page 11: Arquitetura: chega de mesmice

EJBheaven?

Tuesday, October 12, 2010

Page 12: Arquitetura: chega de mesmice

SOAPheaven?

Tuesday, October 12, 2010

Page 13: Arquitetura: chega de mesmice

what is REST?

Tuesday, October 12, 2010

Page 14: Arquitetura: chega de mesmice

what is the future of integration over the web?

Tuesday, October 12, 2010

Page 15: Arquitetura: chega de mesmice

what was REST?

Tuesday, October 12, 2010

Page 16: Arquitetura: chega de mesmice

Restful

Services

Web

Tuesday, October 12, 2010

Page 17: Arquitetura: chega de mesmice

Restful

Servicescreate a saas account

Web

Tuesday, October 12, 2010

Page 18: Arquitetura: chega de mesmice

Restful

Servicescreate a saas account

freeze account

Web

Tuesday, October 12, 2010

Page 19: Arquitetura: chega de mesmice

Restful

Servicescreate a saas account

freeze account

reactivate account

Web

Tuesday, October 12, 2010

Page 20: Arquitetura: chega de mesmice

Restful Services

Web

Tuesday, October 12, 2010

Page 21: Arquitetura: chega de mesmice

Restful Services

http

Web

Tuesday, October 12, 2010

Page 22: Arquitetura: chega de mesmice

Restful Services

http

port 80

Web

Tuesday, October 12, 2010

Page 23: Arquitetura: chega de mesmice

Restful Services

http

port 80

firewall heaven

Web

Tuesday, October 12, 2010

Page 24: Arquitetura: chega de mesmice

Restful

ServicesWeb

Tuesday, October 12, 2010

Page 25: Arquitetura: chega de mesmice

Restful

Services

xml, json

Web

Tuesday, October 12, 2010

Page 26: Arquitetura: chega de mesmice

Restful

Services

xml, json

get, post, ...

Web

Tuesday, October 12, 2010

Page 27: Arquitetura: chega de mesmice

Restful ServicesWeb

But what about Hypermidia?What about consumers?

as of 2009

Tuesday, October 12, 2010

Page 28: Arquitetura: chega de mesmice

Restful ServicesWeb

There is much more!

But what about Hypermidia?What about consumers?

as of 2009

Tuesday, October 12, 2010

Page 29: Arquitetura: chega de mesmice

unresttrips.com: flight details

<?xml version="1.0" encoding="UTF-8" standalum="yes"?><flight> <information> <from>sao paulo</from> <to>seoul</to> </information>  <value>900.00</value></flight>

Tuesday, October 12, 2010

Page 30: Arquitetura: chega de mesmice

service locator when integrating:

coupling++

guilherme

unresttrips.com

unrest pay

Tuesday, October 12, 2010

Page 31: Arquitetura: chega de mesmice

service locator when integrating:

coupling++

guilherme

unresttrips.com

unrest pay

Tuesday, October 12, 2010

Page 32: Arquitetura: chega de mesmice

resttrips.com: flight details

<?xml version="1.0" encoding="UTF-8" standalum="yes"?><flight> <information> <from>sao paulo</from> <to>seoul</to> </information>  <value>900.00</value> <link rel="payment" href="http://resttrips.com/payment/custom"/></flight>

Tuesday, October 12, 2010

Page 33: Arquitetura: chega de mesmice

resttrips.com: flight details

<?xml version="1.0" encoding="UTF-8" standalum="yes"?><flight> <information> <from>sao paulo</from> <to>seoul</to> </information>  <value>900.00</value> <link rel="payment" href="http://resttrips.com/payment/custom"/></flight>

Tuesday, October 12, 2010

Page 34: Arquitetura: chega de mesmice

resttrips.com: making the payment

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value);

Tuesday, October 12, 2010

Page 35: Arquitetura: chega de mesmice

resttrips.com: making the payment

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value);

Tuesday, October 12, 2010

Page 36: Arquitetura: chega de mesmice

resttrips.com: changing its payment provider

<?xml version="1.0" encoding="UTF-8" standalum="yes"?><flight> <information> <from>sao paulo</from> <to>seoul</to> </information>  <value>900.00</value> <link rel="payment" href="http://paysite.com/custom"/></flight>

Tuesday, October 12, 2010

Page 37: Arquitetura: chega de mesmice

resttrips.com: changing its payment provider

<?xml version="1.0" encoding="UTF-8" standalum="yes"?><flight> <information> <from>sao paulo</from> <to>seoul</to> </information>  <value>900.00</value> <link rel="payment" href="http://paysite.com/custom"/></flight>

Tuesday, October 12, 2010

Page 38: Arquitetura: chega de mesmice

dependency injection when integrating:

coupling--

guilherme

resttrips.com

paysite.com

restrips pay

Tuesday, October 12, 2010

Page 39: Arquitetura: chega de mesmice

dependency injection when integrating:

coupling--

guilherme

resttrips.com

paysite.com

restrips pay

Tuesday, October 12, 2010

Page 40: Arquitetura: chega de mesmice

trip = resource

payment = resource

http://kayak.com/f/574XR4

any_uri_unknown_at_compile_time

Tuesday, October 12, 2010

Page 41: Arquitetura: chega de mesmice

Tuesday, October 12, 2010

Page 42: Arquitetura: chega de mesmice

Tuesday, October 12, 2010

Page 43: Arquitetura: chega de mesmice

Tuesday, October 12, 2010

Page 44: Arquitetura: chega de mesmice

Tuesday, October 12, 2010

Page 45: Arquitetura: chega de mesmice

não viajo sozinho

Tuesday, October 12, 2010

Page 46: Arquitetura: chega de mesmice

meu amigo @sergio_caelum

Tuesday, October 12, 2010

Page 47: Arquitetura: chega de mesmice

meu amigo @sergio_caelum

Bilu biluTuesday, October 12, 2010

Page 48: Arquitetura: chega de mesmice

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

resttrips.com: sharing a trip

Tuesday, October 12, 2010

Page 49: Arquitetura: chega de mesmice

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

resttrips.com: sharing a trip

Tuesday, October 12, 2010

Page 50: Arquitetura: chega de mesmice

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

resttrips.com: sharing a trip

Tuesday, October 12, 2010

Page 51: Arquitetura: chega de mesmice

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

// send the payment link to another part of the web

flight = Client.at('http://resttrips.com/f/574XR4').get();

confirmation = flight.getLink("payment"). patch(cardInformation, value/2);

resttrips.com: sharing a trip

Tuesday, October 12, 2010

Page 52: Arquitetura: chega de mesmice

myself = Client.at('http://users.calendar.com') .with(auth).get();

myself.link("calendar").patch(flight.link("self"));

calendar: integrating my systems

Tuesday, October 12, 2010

Page 53: Arquitetura: chega de mesmice

myself = Client.at('http://users.calendar.com') .with(auth).get();

myself.link("calendar").patch(flight.link("self"));

calendar: integrating my systems

Tuesday, October 12, 2010

Page 54: Arquitetura: chega de mesmice

me.link("calendar").patch(link_to_birthday_list)me.link("calendar").patch(link_to_hotel_reservation)me.link("calendar").patch(link_to_trip_details)

calendar: more examples

Tuesday, October 12, 2010

Page 55: Arquitetura: chega de mesmice

so what?

Tuesday, October 12, 2010

Page 56: Arquitetura: chega de mesmice

so what?

Any update on the flight ==> reflects hereAny update on the hotel ==> reflects hereAny update on the meeting ==> reflects here

Tuesday, October 12, 2010

Page 57: Arquitetura: chega de mesmice

so what?

Any update on the flight ==> reflects hereAny update on the hotel ==> reflects hereAny update on the meeting ==> reflects here

don’t just u

se, integrate!

Tuesday, October 12, 2010

Page 58: Arquitetura: chega de mesmice

so what? that was just keeping an URI.

Tuesday, October 12, 2010

Page 59: Arquitetura: chega de mesmice

so what? that was just keeping an URI.

Remove ==> Cancels the flightRemove ==> Cancels the reservationRemove ==> Emails your coworkers

Tuesday, October 12, 2010

Page 60: Arquitetura: chega de mesmice

so what? that was just keeping an URI.

Remove ==> Cancels the flightRemove ==> Cancels the reservationRemove ==> Emails your coworkers

do not central

ize control!

Tuesday, October 12, 2010

Page 61: Arquitetura: chega de mesmice

integration over the web

INTEGRATION is DECENTRALIZING the CONTROLdelegating to multiple agents

distributed systems

Tuesday, October 12, 2010

Page 62: Arquitetura: chega de mesmice

does our ‘rest’ sites in 2010 work

this way?

Tuesday, October 12, 2010

Page 63: Arquitetura: chega de mesmice

so what? that was just keeping an URI.

Remove ==> Cancels the flightRemove ==> Cancels the reservationRemove ==> Emails your coworkers

Tuesday, October 12, 2010

Page 64: Arquitetura: chega de mesmice

so what? that was just keeping an URI.

Remove ==> Cancels the flightRemove ==> Cancels the reservationRemove ==> Emails your coworkers

but which format?

Tuesday, October 12, 2010

Page 65: Arquitetura: chega de mesmice

mas qual o formato dopagamento ou calendário?

Tuesday, October 12, 2010

Page 66: Arquitetura: chega de mesmice

#json, #xml, #soap #etc?

Tuesday, October 12, 2010

Page 67: Arquitetura: chega de mesmice

qual #json, #xml #etc?

Tuesday, October 12, 2010

Page 68: Arquitetura: chega de mesmice

exercise

Tuesday, October 12, 2010

Page 69: Arquitetura: chega de mesmice

who is that guy?

Tuesday, October 12, 2010

Page 70: Arquitetura: chega de mesmice

quem é essa?

Tuesday, October 12, 2010

Page 71: Arquitetura: chega de mesmice

fácil? e ela?

Tuesday, October 12, 2010

Page 72: Arquitetura: chega de mesmice

fácil? e ela?

não é minha filha!

Tuesday, October 12, 2010

Page 73: Arquitetura: chega de mesmice

conteúdo sem semânticanão tem valor!

Tuesday, October 12, 2010

Page 74: Arquitetura: chega de mesmice

so what?

Tuesday, October 12, 2010

Page 75: Arquitetura: chega de mesmice

so what?

micro formats, media types, rdf etc

Tuesday, October 12, 2010

Page 76: Arquitetura: chega de mesmice

so what?

micro formats, media types, rdf etc

micro formats

with hyperlinks!

Tuesday, October 12, 2010

Page 77: Arquitetura: chega de mesmice

integration over the web

Tuesday, October 12, 2010

Page 78: Arquitetura: chega de mesmice

#json, @sergio_caelum

Tuesday, October 12, 2010

Page 79: Arquitetura: chega de mesmice

#?

Tuesday, October 12, 2010

Page 80: Arquitetura: chega de mesmice

de onde veio o # e o @?

Tuesday, October 12, 2010

Page 81: Arquitetura: chega de mesmice

“watching @guilhermecaelum #qconsp *10 great talk”

Atenção: esse tweet é só uma sugestão!

Tuesday, October 12, 2010

Page 82: Arquitetura: chega de mesmice

controlled vocabulary

Tuesday, October 12, 2010

Page 83: Arquitetura: chega de mesmice

emergiu no twitter, por exemplo

Tuesday, October 12, 2010

Page 84: Arquitetura: chega de mesmice

inventar antes o controlled vocabulary?

Tuesday, October 12, 2010

Page 85: Arquitetura: chega de mesmice

top down? Big Design Up Front

O monstro do lago SOAP, longa de 2001

Tuesday, October 12, 2010

Page 86: Arquitetura: chega de mesmice

economizando

# busca um voodef voos_de(site)  base = Restfulie.at(site).get  voos = base.link("opensearch").get.fill("flight").with(:from => "GRU", :to => "JFK").getend

voos = voos_de("kayak")voos << voos_de("tam")voos << voos_de("gol")voos << voos_de("cvc")

voo_mais_barato(voos).link("payment").post(inferno_do_cartao)

Tuesday, October 12, 2010

Page 87: Arquitetura: chega de mesmice

banco

voo = voo_mais_barato(voos)

banco = Restfulie.at("meubanco").auth(eu).get

auth = banco.cartoes["lisa"] .authorization(1.min, voo.preco)voo.link("payment").post(auth)

mais_barato(voos).link("payment")...

Tuesday, October 12, 2010

Page 88: Arquitetura: chega de mesmice

email

Tuesday, October 12, 2010

Page 89: Arquitetura: chega de mesmice

Tuesday, October 12, 2010

Page 90: Arquitetura: chega de mesmice

email

guilherme super viagem

Tuesday, October 12, 2010

Page 91: Arquitetura: chega de mesmice

email

guilherme super viagem

Tuesday, October 12, 2010

Page 92: Arquitetura: chega de mesmice

email

guilherme super viagem

caelum

Tuesday, October 12, 2010

Page 93: Arquitetura: chega de mesmice

email

guilherme super viagem

caelum

Tuesday, October 12, 2010

Page 94: Arquitetura: chega de mesmice

email

guilherme super viagem

caelum

kayak

Tuesday, October 12, 2010

Page 95: Arquitetura: chega de mesmice

email

guilherme super viagem

caelum

kayak

Tuesday, October 12, 2010

Page 96: Arquitetura: chega de mesmice

email

guilherme super viagem

caelum

kayak

Tuesday, October 12, 2010

Page 97: Arquitetura: chega de mesmice

Put your server to RESTleonard richardsons model

Tuesday, October 12, 2010

Page 98: Arquitetura: chega de mesmice

Server Maturity1 uri, 1 http verb

/services.do?action=install&...

Tuesday, October 12, 2010

Page 99: Arquitetura: chega de mesmice

Server Maturity1 uri, 1 http verb

/services.do?action=install&...

@Path("/services")public class Services {

  @GET  public Response services(    @QueryParam("action") String action) {

    ServiceFactory factory = new ServiceFactory();    Service service = factory.getServiceFor(action);    return service.execute();  }

}Tuesday, October 12, 2010

Page 100: Arquitetura: chega de mesmice

Server Maturity

public class InstallService {

  public Response execute() {    return Response.ok()             .type("application/xml")             .entity("<service>...</service>")             .build();  }

}

1 uri, 1 http verb

Tuesday, October 12, 2010

Page 101: Arquitetura: chega de mesmice

But?

Tuesday, October 12, 2010

Page 102: Arquitetura: chega de mesmice

1 uri, 1 http verb

/services.do?action=install&...

I know them all beforehand.

Tuesday, October 12, 2010

Page 103: Arquitetura: chega de mesmice

1 uri, 1 http verb

/services.do?action=install&...

Any change will break all our clients!

Tuesday, October 12, 2010

Page 104: Arquitetura: chega de mesmice

a priori knowledge

Tuesday, October 12, 2010

Page 105: Arquitetura: chega de mesmice

a priori knowledge=

Tuesday, October 12, 2010

Page 106: Arquitetura: chega de mesmice

a priori knowledge=

coupling++

Tuesday, October 12, 2010

Page 107: Arquitetura: chega de mesmice

Server MaturityMultiple uris, 1 http verb

/install?...

Tuesday, October 12, 2010

Page 108: Arquitetura: chega de mesmice

Server MaturityMultiple uris, 1 http verb

/install?...

@Path("/services")public class Services {

  @GET @Path("install")  public Response install() {    return new InstallService().execute();  }

  @GET @Path("uninstall")  public Response uninstall() {    return new UninstallService().execute();  }

Tuesday, October 12, 2010

Page 109: Arquitetura: chega de mesmice

but...

Tuesday, October 12, 2010

Page 110: Arquitetura: chega de mesmice

GET should not imply in undesireable effects

GET hell

Tuesday, October 12, 2010

Page 111: Arquitetura: chega de mesmice

GET could help us with cache!

POST hell

Tuesday, October 12, 2010

Page 112: Arquitetura: chega de mesmice

Server MaturityMultiple uris, multiple verbs

POST /cloudGET /cloud/1547437/softwarePOST /cloud/1547437/software

Tuesday, October 12, 2010

Page 113: Arquitetura: chega de mesmice

rails + restfulierubyonrails.org

Tuesday, October 12, 2010

Page 114: Arquitetura: chega de mesmice

rails + restfulieclass SoftwaresController < ApplicationController    acts_as_restfulie  respond_to :xml, :json    def create    @item = Item.create(params[:item])    respond_with @item, :status => :created  end    def show    @item = Item.find(params[:id])    respond_with @item  endend

rubyonrails.org

Tuesday, October 12, 2010

Page 115: Arquitetura: chega de mesmice

Vraptorvraptor.org/en

Tuesday, October 12, 2010

Page 116: Arquitetura: chega de mesmice

Vraptor

@Resourcepublic class SoftwareResource {

  public void install() {    Software software = SoftwareRepository.register (software);    response.created(software);  }

  public void uninstall() {    response.deleted(software);  }

}

vraptor.org/en

Tuesday, October 12, 2010

Page 117: Arquitetura: chega de mesmice

JAX-RS

@Path("/softwares")public class SoftwareResource {

  @POST @Consumes("application/xml")  public Response install(Software software) {    software = SoftwareRepository.register(software);    long id = software.getId();    URI uri = UriBuilder.fromPath("/softwares/" + id)                                       .build();    software.install();    return Response.created(uri).build();  }

Tuesday, October 12, 2010

Page 118: Arquitetura: chega de mesmice

JAX-RS

  @DELETE @Path("{id}")  public Response uninstall(@PathParam("id") Long id) {    Software software = SoftwareRepository.retrieve(id);    software.uninstall();    return Response.ok().build();  }

Tuesday, October 12, 2010

Page 119: Arquitetura: chega de mesmice

Uniform Interface++Resources++

Tuesday, October 12, 2010

Page 120: Arquitetura: chega de mesmice

Http verbs examplePOST creates

PUT replaces

PATCH updates

DELETE removes

GET retrieves

OPTIONS tells me what i can do

...

Tuesday, October 12, 2010

Page 121: Arquitetura: chega de mesmice

Is a Restful servicea cute CRUD?

Tuesday, October 12, 2010

Page 122: Arquitetura: chega de mesmice

yes

Tuesday, October 12, 2010

Page 123: Arquitetura: chega de mesmice

but there is more!

Tuesday, October 12, 2010

Page 124: Arquitetura: chega de mesmice

enter amazon.com

hypermedia

Tuesday, October 12, 2010

Page 125: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

hypermedia

Tuesday, October 12, 2010

Page 126: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

create a payment (POST)

hypermedia

Tuesday, October 12, 2010

Page 127: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

create a payment (POST)

search (GET)

hypermedia

Tuesday, October 12, 2010

Page 128: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

create a payment (POST)

search (GET)

create a basket (POST)

hypermedia

Tuesday, October 12, 2010

Page 129: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

create a payment (POST)

search (GET)

create a basket (POST)

follow links

hypermedia

Tuesday, October 12, 2010

Page 130: Arquitetura: chega de mesmice

enter amazon.com

search (GET)

create a payment (POST)

search (GET)

create a basket (POST)

follow links

fill forms

hypermedia

Tuesday, October 12, 2010

Page 131: Arquitetura: chega de mesmice

Cloud API

GET /user/15 retrieves an user

Tuesday, October 12, 2010

Page 132: Arquitetura: chega de mesmice

Cloud API

GET /user/15 retrieves an user

follow GET machines accesses its machines

Tuesday, October 12, 2010

Page 133: Arquitetura: chega de mesmice

Cloud API

GET /user/15 retrieves an user

follow GET machines accesses its machines

follow POST self installs a new machine

Tuesday, October 12, 2010

Page 134: Arquitetura: chega de mesmice

Cloud API

GET /user/15 retrieves an user

follow GET machines accesses its machines

follow POST self installs a new machine

follow POST payment pay for it

Tuesday, October 12, 2010

Page 135: Arquitetura: chega de mesmice

$ curl http://localhost:9998/user/574 -iHTTP/1.1 200 OK...

retrieves an user

Tuesday, October 12, 2010

Page 136: Arquitetura: chega de mesmice

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user>    <link rel="machines" href="/user/574/machines"/>    <name>guilherme silveira</name>    <website>www.caelum.com.br</site>   <link rel="payment" href="/payment/custom"/>    ...</user>

user

Tuesday, October 12, 2010

Page 137: Arquitetura: chega de mesmice

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user>    <link rel="machines" href="/user/574/machines"/>    <name>guilherme silveira</name>    <website>www.caelum.com.br</site>   <link rel="payment" href="/payment/custom"/>    ...</user>

user

Tuesday, October 12, 2010

Page 138: Arquitetura: chega de mesmice

$ curl http://localhost:9998/user/574/machines -iHTTP/1.1 200 OKContent-Type: application/xml

maschine maschine maschine

Tuesday, October 12, 2010

Page 139: Arquitetura: chega de mesmice

maschine<?xml version="1.0" encoding="UTF-8" standalone="yes"?><machines xmlns:ns2="http://www.w3.org/2005/Atom">  <machine>    <ns2:link rel="self" href="/user/574/machines/1"/>    <ns2:link rel="software" href="/machines1/softwares"/>    <id>1</id>    <host>www.caelum.com.br</host>    <softwares>      <software>        <id>1234</id>        <ns2:link rel="self" href="/softwares/1234"/>      </software>    </softwares>  </machine></machines>

Tuesday, October 12, 2010

Page 140: Arquitetura: chega de mesmice

maschine<?xml version="1.0" encoding="UTF-8" standalone="yes"?><machines xmlns:ns2="http://www.w3.org/2005/Atom">  <machine>    <ns2:link rel="self" href="/user/574/machines/1"/>    <ns2:link rel="software" href="/machines1/softwares"/>    <id>1</id>    <host>www.caelum.com.br</host>    <softwares>      <software>        <id>1234</id>        <ns2:link rel="self" href="/softwares/1234"/>      </software>    </softwares>  </machine></machines>

Tuesday, October 12, 2010

Page 141: Arquitetura: chega de mesmice

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user>    <link rel="machines" href="/user/574/machines"/>    <name>guilherme silveira</name>    <website>www.caelum.com.br</site>   <link rel="payment" href="/payment/custom"/>    ...</user>

payment

Tuesday, October 12, 2010

Page 142: Arquitetura: chega de mesmice

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><user>    <link rel="machines" href="/user/574/machines"/>    <name>guilherme silveira</name>    <website>www.caelum.com.br</site>   <link rel="payment" href="/payment/custom"/>    ...</user>

payment

Tuesday, October 12, 2010

Page 143: Arquitetura: chega de mesmice

#buthow?

Tuesday, October 12, 2010

Page 144: Arquitetura: chega de mesmice

Machine.java

@XmlRootElement@XmlType(propOrder= {"id", "host", "softwares", "links"})public class Machine {  private final all variables here;

  @XmlElement(name="link", namespace="http://www.w3.org/2005/Atom")  public List<Link> getLinks() {    return Arrays.asList(      Link.to("/machines/" + getId(), "self"),      Link.to("/machines/" + getId() + "/softwares", "softwares")    );  }

  @XmlElementWrapper(name="softwares")  @XmlElement(name="software")  public List<Software> getSoftwares() {    return softwares;  }

  public void install(Software software) {    getSoftwares().add(software);  }

  public void uninstall(Software software) {    getSoftwares().remove(software);  }

}

Tuesday, October 12, 2010

Page 145: Arquitetura: chega de mesmice

Machine.java

@XmlRootElement@XmlType(propOrder= {"id", "host", "softwares", "links"})public class Machine {  private final all variables here;

  @XmlElement(name="link", namespace="http://www.w3.org/2005/Atom")  public List<Link> getLinks() {    return Arrays.asList(      Link.to("/machines/" + getId(), "self"),      Link.to("/machines/" + getId() + "/softwares", "softwares")    );  }

  @XmlElementWrapper(name="softwares")  @XmlElement(name="software")  public List<Software> getSoftwares() {    return softwares;  }

  public void install(Software software) {    getSoftwares().add(software);  }

  public void uninstall(Software software) {    getSoftwares().remove(software);  }

}

Tuesday, October 12, 2010

Page 146: Arquitetura: chega de mesmice

@Path("/machines")public class MachineResource {

@Path("{id}/softwares") public SoftwareResource softwares(@PathParam("id") Long id) { Machine machine = new MachineRepository().retrieve(id); if (machine != null) { SoftwareResource softwareResource = new SoftwareResource(); softwareResource.setMachine(machine); return softwareResource; } throw new WebApplicationException(404); }

@POST @Consumes("application/xml") public Response create(Machine machine) { Long id = new MachineRepository().save(machine); return Response.created(UriBuilder.fromPath("/" + id).build()).build(); }

@GET @Path("{id}") @Produces("application/xml") public Machine show(@PathParam("id") Long id) { return new MachineRepository().retrieve(id); }

@GET @Produces("application/xml") public Machines list() { Machines machines = new Machines(); machines.setMachine(new MachineRepository().list()); return machines; }}

MachineResource

Tuesday, October 12, 2010

Page 147: Arquitetura: chega de mesmice

@Path("/machines")public class MachineResource {

@Path("{id}/softwares") public SoftwareResource softwares(@PathParam("id") Long id) { Machine machine = new MachineRepository().retrieve(id); if (machine != null) { SoftwareResource softwareResource = new SoftwareResource(); softwareResource.setMachine(machine); return softwareResource; } throw new WebApplicationException(404); }

@POST @Consumes("application/xml") public Response create(Machine machine) { Long id = new MachineRepository().save(machine); return Response.created(UriBuilder.fromPath("/" + id).build()).build(); }

@GET @Path("{id}") @Produces("application/xml") public Machine show(@PathParam("id") Long id) { return new MachineRepository().retrieve(id); }

@GET @Produces("application/xml") public Machines list() { Machines machines = new Machines(); machines.setMachine(new MachineRepository().list()); return machines; }}

MachineResource

Tuesday, October 12, 2010

Page 148: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

one uri + one verb

Tuesday, October 12, 2010

Page 149: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

one uri + one verb

Ugly

Tuesday, October 12, 2010

Page 150: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

multipleuris

one uri + one verb

Tuesday, October 12, 2010

Page 151: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

multipleuris

one uri + one verb

Less ugly

Tuesday, October 12, 2010

Page 152: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

multipleverbs

multipleuris

one uri + one verb

Tuesday, October 12, 2010

Page 153: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

multipleverbs

multipleuris

one uri + one verb

cute CRUD

Tuesday, October 12, 2010

Page 154: Arquitetura: chega de mesmice

Server Modelaccording toLeonard Richardson, 2008

multipleverbs

multipleuris

hypermedia

one uri + one verb

rest

Tuesday, October 12, 2010

Page 155: Arquitetura: chega de mesmice

JAX-RS wishlist

VRaptor and Restfulie

Tuesday, October 12, 2010

Page 156: Arquitetura: chega de mesmice

examplesvraptor.org/en

Tuesday, October 12, 2010

Page 157: Arquitetura: chega de mesmice

1. conventions?

@Path("/services")public class Services {

  @GET  public Response services(    @QueryParam("action") String action) {

    ServiceFactory factory = new ServiceFactory();    Service service = factory.getServiceFor(action);    return service.execute();  }

}Tuesday, October 12, 2010

Page 158: Arquitetura: chega de mesmice

Convention over Configuration

@Resourcepublic class Services { private final ServiceFactory factory; public Services(ServiceFactory factory) { this.factory = factory; }

public void services(String action) { factory.getServiceFor(action).execute(); }

}Tuesday, October 12, 2010

Page 159: Arquitetura: chega de mesmice

do you want to avoid copy+paste?

Tuesday, October 12, 2010

Page 160: Arquitetura: chega de mesmice

yes!

Tuesday, October 12, 2010

Page 161: Arquitetura: chega de mesmice

yes!

Tuesday, October 12, 2010

Page 162: Arquitetura: chega de mesmice

2. TDD: hard to test@Path("/products")public class Products {

  @GET  public Response create(    @QueryParam("what") String what) {

    // persists    return Response.ok()             .type("application/xml")             .entity("<product>...</product>")             .build();  }

}

coupled to the implementation

Tuesday, October 12, 2010

Page 163: Arquitetura: chega de mesmice

TDD: mock it

@Resourcepublic class Services { private final Response response; public Services(Response response) { this.response = response; }

public void services(String action) { response.getServiceFor(action).execute(); }

}

coupled to the interfacecouple--

Tuesday, October 12, 2010

Page 164: Arquitetura: chega de mesmice

TDD: mock it

@Resourcepublic class Services { private final Response response; public Services(Response response) { this.response = response; }

public void services(String action) { response.getServiceFor(action).execute(); }

}

coupled to the interfacecouple--

Tuesday, October 12, 2010

Page 165: Arquitetura: chega de mesmice

3. Content negotiation by hand

@Path("/softwares")public class SoftwareResource {

  @POST @Consumes("application/xml")  public Response install(Software software) {    software = SoftwareRepository.register(software);    long id = software.getId();    URI uri = UriBuilder.fromPath("/softwares/" + id)                                       .build(); software.install();    return Response.created(uri).build();  }

Tuesday, October 12, 2010

Page 166: Arquitetura: chega de mesmice

Let us do it for you.

@Resourcepublic class SoftwareResource {

@Post @Consumes  public void install(Software software) {    software = SoftwareRepository.register(software);    response.created(software);  }

}

Tuesday, October 12, 2010

Page 167: Arquitetura: chega de mesmice

Let us do it for you.

@Resourcepublic class SoftwareResource {

@Post @Consumes  public void install(Software software) {    software = SoftwareRepository.register(software);    response.created(software);  }

}

Tuesday, October 12, 2010

Page 168: Arquitetura: chega de mesmice

4. URI coupling

...

  @GET @Path("/softwares/{id}")  public Response install(@QueryParam("id") Software software) { // ...  }

writing the URI once

Tuesday, October 12, 2010

Page 169: Arquitetura: chega de mesmice

4. URI coupling

@Path("/softwares")public class SoftwareResource {

  @POST @Consumes("application/xml")  public Response install(Software software) {    software = SoftwareRepository.register(software);    long id = software.getId();    URI uri = UriBuilder.fromPath("/softwares/" + id)                                       .build(); software.install();    return Response.created(uri).build();  }

writing the URI again several times

Tuesday, October 12, 2010

Page 170: Arquitetura: chega de mesmice

4. URI coupling

@Path("/softwares")public class SoftwareResource {

  @POST @Consumes("application/xml")  public Response install(Software software) {    software = SoftwareRepository.register(software);    long id = software.getId();    URI uri = UriBuilder.fromPath("/softwares/" + id)                                       .build(); software.install();    return Response.created(uri).build();  }

code

Tuesday, October 12, 2010

Page 171: Arquitetura: chega de mesmice

ZERO uri replication

@Resourcepublic class SoftwareResource {

@Post @Consumes  public void install(Software software) {    // ...    response.use(SoftwareResource.class).show(software);  }

}

Tuesday, October 12, 2010

Page 172: Arquitetura: chega de mesmice

ZERO uri replication

@Resourcepublic class SoftwareResource {

@Post @Consumes  public void install(Software software) {    // ...    response.use(SoftwareResource.class).show(software);  }

}

Tuesday, October 12, 2010

Page 173: Arquitetura: chega de mesmice

@Path("/machines")public class MachineResource {

@Path("{id}/softwares") public SoftwareResource softwares(@PathParam("id") Long id) { Machine machine = new MachineRepository().retrieve(id); if (machine == null) { throw new WebApplicationException(404); } // ... }

}

5. Parameter list

Tuesday, October 12, 2010

Page 174: Arquitetura: chega de mesmice

Yes, we can do it.

@Resourcepublic class MachineResource {

@Post ("{m.id}/softwares") public SoftwareResource softwares(Machine m) { Machine machine = new MachineRepository().retrieve(m); // ... }

}

parameter converter chain of responsabilityTuesday, October 12, 2010

Page 175: Arquitetura: chega de mesmice

Yes, we can do it.

@Resourcepublic class MachineResource {

@Post ("{m.id}/softwares") public SoftwareResource softwares(Machine m) { Machine machine = new MachineRepository().retrieve(m); // ... }

}

parameter converter chain of responsabilityTuesday, October 12, 2010

Page 176: Arquitetura: chega de mesmice

examplerestfulie.caelumobjects.com

Tuesday, October 12, 2010

Page 177: Arquitetura: chega de mesmice

Response response = client.at ("http://localhost:9998/user/574").get();

6. Client internal DSLs

Tuesday, October 12, 2010

Page 178: Arquitetura: chega de mesmice

Response response = client.at ("http://localhost:9998/user/574").get();

User user = response.getResource();System.out.println("user: " + user.getName());

6. Client internal DSLs

Tuesday, October 12, 2010

Page 179: Arquitetura: chega de mesmice

User user = response.getResource();System.out.println("user: " + user.getName());

Link link = resource(user).getLink("machine");response = link.follow().post(new Machine());

Tuesday, October 12, 2010

Page 180: Arquitetura: chega de mesmice

Link link = resource(user).getLink("machine");response = link.follow().post(new Machine());

double amount = resource(user).refresh(). getAmountDue();

Tuesday, October 12, 2010

Page 181: Arquitetura: chega de mesmice

double amount = resource(user).refresh(). getAmountDue();

link = resource(user).getLink("payment");Payment payment = new Payment(amount);response = link.follow().post(payment);

Tuesday, October 12, 2010

Page 182: Arquitetura: chega de mesmice

System.out.println("payment completed");

link = resource(user).getLink("payment");Payment payment = new Payment(amount);response = link.follow().post(payment);

Tuesday, October 12, 2010

Page 183: Arquitetura: chega de mesmice

System.out.println("payment completed");

link = resource(user).getLink("payment");Payment payment = new Payment(amount);response = link.follow().post(payment);

i was looking for a DSL and i did not know it!

Tuesday, October 12, 2010

Page 184: Arquitetura: chega de mesmice

bottom up

microformato

mime type?

design by committe

controlled vocabulary

Tuesday, October 12, 2010

Page 185: Arquitetura: chega de mesmice

hypermídiaviabilizando a integração através da web

Tuesday, October 12, 2010

Page 186: Arquitetura: chega de mesmice

obrigado

Tuesday, October 12, 2010

Page 187: Arquitetura: chega de mesmice

code samples

Lucas Cavalcanti(java server)@lucascs

Anderson Leite (ruby)@anderson_leite

Tuesday, October 12, 2010

Page 188: Arquitetura: chega de mesmice

Further reading

Tuesday, October 12, 2010

Page 189: Arquitetura: chega de mesmice

Roy Fielding dissertation

Further reading

Tuesday, October 12, 2010

Page 190: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Further reading

Tuesday, October 12, 2010

Page 191: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Restful Webservices Cookbook, Subbu Allamaraju

Further reading

Tuesday, October 12, 2010

Page 192: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Restful Webservices Cookbook, Subbu Allamaraju

Restful Web Services, Richardson and Ruby

Further reading

Tuesday, October 12, 2010

Page 193: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Restful Webservices Cookbook, Subbu Allamaraju

Restful Web Services, Richardson and Ruby

JAX-RS specification

Further reading

Tuesday, October 12, 2010

Page 194: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Restful Webservices Cookbook, Subbu Allamaraju

Restful Web Services, Richardson and Ruby

JAX-RS specification

Infoq articles on REST

Further reading

Tuesday, October 12, 2010

Page 195: Arquitetura: chega de mesmice

Roy Fielding dissertation

Rest in Practice, Jim Webber and others

Restful Webservices Cookbook, Subbu Allamaraju

Restful Web Services, Richardson and Ruby

JAX-RS specification

Infoq articles on REST

Restfulie guide

Further reading

Tuesday, October 12, 2010

Page 196: Arquitetura: chega de mesmice

Interviews and Presentations

Tuesday, October 12, 2010

Page 197: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

Interviews and Presentations

Tuesday, October 12, 2010

Page 198: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

http://bit.ly/9RUXKL

Interviews and Presentations

Tuesday, October 12, 2010

Page 199: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

http://bit.ly/9RUXKL

Leonard Richardson’s presentation at QCon

Interviews and Presentations

Tuesday, October 12, 2010

Page 200: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

http://bit.ly/9RUXKL

Leonard Richardson’s presentation at QCon

http://bit.ly/dj2W66

Interviews and Presentations

Tuesday, October 12, 2010

Page 201: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

http://bit.ly/9RUXKL

Leonard Richardson’s presentation at QCon

http://bit.ly/dj2W66

Martin Fowler on REST

Interviews and Presentations

Tuesday, October 12, 2010

Page 202: Arquitetura: chega de mesmice

Stefan Tilkov interview on InfoQ

http://bit.ly/9RUXKL

Leonard Richardson’s presentation at QCon

http://bit.ly/dj2W66

Martin Fowler on REST

http://bit.ly/bx61ci

Interviews and Presentations

Tuesday, October 12, 2010

Page 203: Arquitetura: chega de mesmice

Interviews and Presentations

Tuesday, October 12, 2010

Page 204: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

Interviews and Presentations

Tuesday, October 12, 2010

Page 205: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

http://bit.ly/aEuzj3

Interviews and Presentations

Tuesday, October 12, 2010

Page 206: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

http://bit.ly/aEuzj3

Jan Algermissen classification

Interviews and Presentations

Tuesday, October 12, 2010

Page 207: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

http://bit.ly/aEuzj3

Jan Algermissen classification

http://bit.ly/cycFBF

Interviews and Presentations

Tuesday, October 12, 2010

Page 208: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

http://bit.ly/aEuzj3

Jan Algermissen classification

http://bit.ly/cycFBF

Guilherme Silveira on REST clients

Interviews and Presentations

Tuesday, October 12, 2010

Page 209: Arquitetura: chega de mesmice

Ian Robinson and Jim Webber interview

http://bit.ly/aEuzj3

Jan Algermissen classification

http://bit.ly/cycFBF

Guilherme Silveira on REST clients

http://bit.ly/aHCglv

Interviews and Presentations

Tuesday, October 12, 2010

Page 210: Arquitetura: chega de mesmice

code samples

Tuesday, October 12, 2010

Page 211: Arquitetura: chega de mesmice

JAX-RS

code samples

Tuesday, October 12, 2010

Page 212: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

code samples

Tuesday, October 12, 2010

Page 213: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

code samples

Tuesday, October 12, 2010

Page 214: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

http://rubyonrails.org

code samples

Tuesday, October 12, 2010

Page 215: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

http://rubyonrails.org

Restfulie

code samples

Tuesday, October 12, 2010

Page 216: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

http://rubyonrails.org

Restfulie

http://restfulie.caelumobjects.com

code samples

Tuesday, October 12, 2010

Page 217: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

http://rubyonrails.org

Restfulie

http://restfulie.caelumobjects.com

VRaptor

code samples

Tuesday, October 12, 2010

Page 218: Arquitetura: chega de mesmice

JAX-RS

http://jcp.org/en/jsr/detail?id=311

Rails

http://rubyonrails.org

Restfulie

http://restfulie.caelumobjects.com

VRaptor

http://vraptor.org/en

code samples

Tuesday, October 12, 2010