Projecto Integrador
Notas
§
Imagens do livro:
§
G. Alonso et. Al. Web Services: Concepts, Architectures and Applications,
Sumário
§
REST: modelo
§
REST: protocolos
§
REST: programação
Contexto
§
Sistema de informação pervasivos
§
Necessidade de fornecer serviços
§
Necessidade de aceder a serviços
Leitura Fortemente Recomendada
§
A RESTful Web service, an example
REST: Representational State Transfer
§
Estilo ou padrão arquitectural, não um sistema de desenvolvimento;; não
uma especificação ou normalização
formal.
§
Aproximação: vê uma aplicação como uma colecção de recursos
§
Um recurso é identificado por um URI/URL
§
Um URL devolve um documento com a representação do recurso
§
Um URL pode referir uma colecção de recursos
§
Podem-se fazer referências a outros recursos usando
ligações (links)
§
Aproximação proposta por Roy Fielding na sua tese de doutoramento
§
Não como uma alternativa aos web services, mas como uma forma de
REST: princípios de desenho
§
Protocolo cliente/servidor stateless: cada pedido contém toda a
informação necessária para ser processado
§
Objectivo: tornar o sistema simples.
§
Recursos: no sistema tudo são recursos, identificados por um URI/URL.
§
Recursos tipicamente armazenados num formato estruturado que suporta
hiper-ligações (e.g. XML)
§
Interface uniforme: todos os recursos são acedidos por um conjunto de
operações HTTP bem-definidas
§
POST – criar
§
GET – let
§
PUT – atualizar/substituir
§
DELETE – remover
REST: princípios de desenho
§
Usa HTTP GET, POST, etc., mas
§
Usa dados bem-tipados (e.g., usando schemas XML, json)
§
Cache: para melhorar desempenho, respostas podem ser etiquetadas
A salientar…
§
Aspectos determinantes: stateless & cacheable, web-oriented
§
Rentabiliza a vasta experiência, maturidade e o investimento prévio na
infraestrutura envolvente da web: servidores, proxies, caches, software,
bibliotecas, etc.
Mais detalhes e exemplo
§
Um exemplo (de Roger L. Costello)
§
Uma empresa pretende disponibilizar web services REST para permitir aos
seus clientes:
§
Obter uma lista de peças
§
Obter informação detalhada sobre uma peça
Exemplo: listagem
§
Tornar uma lista de peças disponível como um recurso
§
GET http://www.parts-depot.com/parts
<?xml version="1.0"?>
<p:Parts xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part id="00345" xlink:href="http://www.parts-depot.com/parts/00345"/>
<Part id="00346" xlink:href="http://www.parts-depot.com/parts/00346"/>
<Part id="00348" xlink:href="http://www.parts-depot.com/parts/00348"/>
</p:Parts>
Exemplo: obter informação sobre entidade
§
Obter detalhes sobre uma peça
GET http://www.parts-depot.com/parts/00345?flavor=xml
<?xml version="1.0"?>
<p:Part xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part-ID>00345</Part-ID>
<Name>Widget-A</Name>
<Description>This part is used within the frap
assembly</Description>
<Specification
xlink:href="http://www.parts-depot.com/parts/00345/specification"/>
<UnitCost currency="USD">0.10</UnitCost>
<Quantity>10</Quantity>
</p:Part>
Exemplo: criar informação
§
Submeter uma ordem de compra
POST http://www.parts-depot.com/order
<?xml version="1.0"?>
<p:Order xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part-ID>00345</Part-ID>
<UnitCost currency="USD">0.10</UnitCost>
<Quantity>10</Quantity>
</p:Part>
Exemplo: listagem com filtragem / pesquisa
§
Tornar uma lista de peças disponível como um recurso
GET http://www.parts-depot.com/parts?query=hammer
GET http://www.parts-depot.com/parts/hammer
<?xml version="1.0"?>
<p:Parts xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part id="00345" xlink:href="http://www.parts-depot.com/parts/00345"/>
</p:Parts>
Exemplo: listagem com filtragem
§
Lista de ordens de compra dum utilizador
GET http://www.parts-depot.com/nuno/order
GET http://www.parts-depot.com/order/nuno
<?xml version="1.0"?>
<p:Orders xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Order id="00301" xlink:href="http://www.parts-depot.com/order/00301 "/>
<Order id="00302" xlink:href="http://www.parts-depot.com/order/00302 "/>
</p:Parts>
Exemplo: listagem com múltiplos filtros
§
Lista de ordens de compra dum utilizador num dado mês
GET http://www.parts-depot.com/nuno/order?month=Jan-2012
GET http://www.parts-depot.com/nuno/order/Jan-2012
<?xml version="1.0"?>
<p:Orders xmlns:p="http://www.parts-depot.com"
xmlns:xlink=
http://www.w3.org/1999/xlink
>
<Order id="00302" xlink:href="http://www.parts-depot.com/order/00302 "/>
</p:Parts>
Exemplo: listagem com paginação
§
Tornar parte uma lista de peças disponível como um recurso
GET http://www.parts-depot.com/parts?query=hammer&start=1&end=10
GET http://www.parts-depot.com/parts/hammer&start=1&end=10
<?xml version="1.0"?>
<p:Parts xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Part id="00345" xlink:href="http://www.parts-depot.com/parts/00345"/>
</p:Parts>
Exemplo: contagem
§
Contar número de elementos duma lista de peças
GET http://www.parts-depot.com/parts/count
<?xml version="1.0"?>
<p:PartsCount xmlns:p="http://www.parts-depot.com"
xmlns:xlink="http://www.w3.org/1999/xlink">
3
</p:PartsCount>
REST vs. RPCs/Web Services
§
Nos sistemas de RPCs/Web Services a ênfase é nas operações que
podem ser invocadas
§
Nos sistemas REST, a ênfase é nos recusos, na sua representação e em
REST: protocolos
§
Baseado em protocolos standard
§
Comunicação
§
HTTP (tipicamente)
§
Identifcação de recursos
§
URL/URI
§
Representação dos recursos
XML vs. Json
<Person firstName='John'
lastName='Smith' age='25'>
<Address streetAddress='21 2nd
Street' city='New York' state='NY'
postalCode='10021' />
<PhoneNumbers home='212 555-
1234' fax='646 555-4567' />
</Person>
{ "Person”: {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address”: {
"streetAddress":"21 2
nd
Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers”: {
"home":"212 555-1234",
"fax":"646 555-4567"
REST: programação cliente
§
Estilo bricolage
§
Biblioteca invocação métodos HTTP
§
Java: URL
§
JavaScript: XMLHttpRequest
§
Ruby: Net:HTTP
§
Bibliotecas para codificação de dados
§
Java: XML -> JAXP;; JSON -> google it J
§
JavaScript: XML -> XMLHttpRequest;; JSON -> objecto JavaScript
§
PHP: XML, JSON installed in PHP > 5.2
§
Estilo framework
§
Sistemas em que integram mecanismos anteriores de forma coerente
§
Java: JAX-RS;; PHP: EasyRest, Recess, …;; JavaScript: jQuery
REST: cliente Javascript
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function()
{
dosomething(httpRequest); };
httpRequest.open("GET", “http://.../parts”, true);
httpRequest.send(null);
REST: cliente Ruby on Rails
Net::HTTP.get('example.com', '/index.html') # => String
uri = URI('http://example.com/some_path?query=string')
Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Get.new uri.request_uri
response = http.request request # Net::HTTPResponse
object
REST: programação servidor
§
Estilo bricolage
§
Cliente +
§
Biblioteca servidor/Application server
§
Estilo framework
§
Sistemas em que integram mecanismos anteriores de forma coerente
§
Java: Jersey, Jboss, Restlet, etc.
§
PHP: Recess, Zend Rest, etc.
§
Ruby on Rails: rails routing
REST: servidor Ruby on Rails
resources :parts
HTTP Verb Path
action
used for
GET
/parts
index
display a list of all part
GET
/parts/new
new
return an HTML form for creating a
new part
POST
/parts
create
create a new part
GET
/parts/:id
show
display a specific part
GET
/parts/:id/edit
edit
return an HTML form for editing a
part
PUT
/parts/:id
update
update a specific part
REST: programação em Java
§
Definido em JAX-RS (JSR 311)
§
Suporte linguístico baseado na utilização de anotações
§
Permite definir que um dado URL/operação HTTP leva à execução
dum dado método
§
Permite definir o modo de codificação da resposta/pedido
§
XML – usando mecanismo standard de codificação de cobjectos java em
XML fornecido pelo JAXB
REST: suporte Java (exemplo)
@Path("/customerservice/")
@ProduceMime("application/xml")
public class CustomerService {
@GET
public Customers getCustomers() { ... }
@GET
@Path("/customers/{id}")
@Produces("application/json")
public Customer getCustomer(@PathParam("id") String id) {... }
@PUT
@Path("/customers/{id}")
@Consumes("application/xml")
public Response updateCustomer(@PathParam("id") long id, Customer customer)
{ ... }
REST: suporte Java (exemplo)
@POST
@Path("/customers")
public Response addCustomer(Customer customer) { ... }
@DELETE
@Path("/customers/{id}/")
public Response deleteCustomer(@PathParam("id") String id) { ... }
@Path("/orders/{orderId}/")
public Order getOrder(@PathParam("orderId") String orderId) { ... }
}
Conclusões
§
Grande popularidade
§
Muitos serviços web disponibilizados segundo este modelo
§
Grandes vantagens: simplicidade e desempenho
§
Serviços disponibilizados num modelo REST nem sempre aderem
Ligações
§
REST
§
Fielding’s TOIT paper:
http://www.ics.uci.edu/~taylor/documents/2002-REST-TOIT.pdf
§
Wikipedia:
http://en.wikipedia.org/wiki/Representational_State_Transfer
§
Exemplo Delicious: http://www.peej.co.uk/articles/restfully-delicious.html
§
Ruby on Rails
§
Net:Http:
http://ruby-doc.org/stdlib-
1.9.3/libdoc/net/http/rdoc/Net/HTTP.html
§
Routing
http://guides.rubyonrails.org/routing.html
§
Javascript
§
XMLHttpRequest: http://www.w3.org/TR/XMLHttpRequest/
§
http://api.jquery.com/jQuery.ajax/
Ligações
§
Java
§
Docs
§
JAX-RS spec:
http://jsr311.java.net/
§
Restful Java with JAX-RS:
§