Projecto Integrador Introdução ao REST Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 1
Notas Imagens do livro: G. Alonso et. Al. Web Services: Concepts, Architectures and Applications, Springer, 2004. Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 2
Sumário REST: modelo REST: protocolos REST: programação Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 3
Contexto Sistema de informação pervasivos Necessidade de fornecer serviços Necessidade de aceder a serviços Criar serviços mais complexos Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 4
Web services: dentro de uma organização Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 5
Web services: entre organizações Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 6
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 aceder a informação Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 7
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 / 8
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 como permitindo ou não caching. Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 9
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 Submeter uma ordem de compra Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 10
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> Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 11
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> Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 12
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> Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 13
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 / 14
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> Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 15
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 / 16
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> Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 17
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 / 18
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 como estes são afectados por um conjunto de métodos standard Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 19
Outro exemplo Sugestões? Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 20
REST: protocolos Baseado em protocolos standard Comunicação HTTP (tipicamente) Identifcação de recursos URL/URI Representação dos recursos XML, JSon Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 21
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> (Example from wikipedia) { "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" } } } Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 22
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 Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 23
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 / 24
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! end! Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 25
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 / 26
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" DELETE" /parts/:id" destroy" delete a specific part" Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 27
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 JSON mecanismo leve de codificação de tipos (RFC 4627) Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 28
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) {... } Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 29
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 / 30
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 http://api.flickr.com/services/rest/?method=flickr.photos.search&appid=sdfjkshf Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 31
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 / 32
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 Restlet: http://www.restlet.org/ Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 33
Ligações (cont.) PHP Docs JSON 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 http://www.json.org/ http://www.json.org/java/ http://php.net/manual/en/book.json.php http://flori.github.com/json/ Material de suporte às aulas de Proj. Integrador (Nuno Preguiça) Copyright DI FCT/ UNL / 34