Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 1
Projecto Integrador
Notas
§ Imagens do livro:
§ G. Alonso et. Al. Web Services: Concepts, Architectures and Applications,
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 3
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
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 5
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 7
REST: Representational State Transfer
§ Aproximação: vê uma aplicação como uma colecção de recursos
§ Um recuso é 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)
§ Estilo arquitectural, não um sistema de desenvolvimento
§ Aproximação proposta por Roy Fielding na sua tese de doutroamento
§ 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 – actualizar § DELETE – remover
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 9
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
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
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 11
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>
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 13
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>
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 15
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>
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 17
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>
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 19
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
Outro exemplo
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 21
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 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021" }, "PhoneNumbers”: { "home":"212 555-1234", "fax":"646 555-4567" }
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 23
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);!
! !
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 25
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
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 27
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
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 29
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) { ... } }
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 31
Conclusões
§ Tem ganho popularidade
§ Muitos serviços web disponibilizados segundo este modelo § Grandes vantagens: simplicidade e desempenho
§ Serviços disponibilizados num modelo REST nem sempre aderem
completamente aos princípios REST
§ Difícil disponibilizar número elevado de métodos
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/
Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) – Copyright DI – FCT/ UNL / 33
Ligações
§ Java
§ Docs
§ JAX-RS spec: http://jsr311.java.net/
§ Restful Java with JAX-RS:
§ http://books.google.com/books?id=_jQtCL5_vAcC&lpg=PP1&ots=cJdr7eTV1X&dq=jax-rs&pg=PP1#v=onepage&q=&f=false
§ Frameworks
§ Jersey: http://jersey.java.net/
§ Jboss: http://www.jboss.org/resteasy
Ligações (cont.)
§ PHP § Docs § http://php.net/manual/en/book.http.php § http://php.net/manual/en/book.json.php § Framework § Recess: http://www.recessframework.org/ § EasyRest: http://code.google.com/p/easyrest/§ Zend Rest: http://framework.zend.com/manual/en/zend.rest.html
§ JSON
§ http://www.json.org/
§ http://www.json.org/java/
§ http://php.net/manual/en/book.json.php