[Atualizado em 2008-10-18.]
Já ouviu falar em REST?
É o acrônimo para o termo em inglês Representational State Transfer, ou Transferência de Estado Representacional. O termo foi introduzido por Roy Thomas Fielding — um dos principais autores da especificação HTTP e autoridade em arquitetura de redes de computadores — no ano de 2000, em sua tese de doutorado (Ph.D.): Architectural Styles and the Design of Network-based Software Architectures, Universidade da Califórnia, Irvine, EUA. O capítulo 5 da tese versa sobre Representational State Transfer (REST).
De 2000 até agora, o conceito vem se difundido e se popularizando como um estilo de arquitetura de software moderno para sistemas hipermídia distribuídos, em especial as aplicações na World Wide Web (WWW, ou simplesmente web “para os íntimos”).
O conceito de REST e os sistemas RESTful (aderentes aos princípios de REST) refletem, em minha opinião, uma das muitas facetas do aumento da abstração e complexidade na arquitetura das aplicações via Internet.
Desde que a web surgiu no início da década de 1990 — criada por Tim Berners-Lee no CERN — até hoje, acompanhamos seu aumento de abrangência e complexidade. Surgiu como um meio simples e prático de disponibilização de conteúdo hipermídia na Internet.
Ao longo dos anos, por um lado o conteúdo da web se tornou mais rico e multimídia com a introdução de imagem, animações, áudio e vídeo etc. Por outro, sua interatividade cresce em ritmo acelerado, tornando a web um canal de interação, aplicações e serviços cada vez mais amplo.
As aplicações na web também deram os primeiros passos com o protocolo Common Gateway Interface (CGI) até chegarem à era atual dos Web Services (WS), da Arquitetura Orientada a Serviços (Service-Oriented Architecture – SOA) e seu uso nos sistemas de Gerenciamento de Processos de Negócio (Business Process Management – BPM).
Assim, a web deixa de ser a camada de mais alto nível de abstração na pilha das aplicações Internet (WWW → HTTP → TCP/IP). Acima dela se posicionam sistemas complexos que tem a web como “mera” base de infraestrutura. Neste topo entram princípios e mecanismos como REST, WS, SOA e AJAX, bem como os frameworks de aplicação web de alto nível — baseados em componentes — como Java EE (JSF → JSP → Servlets), Microsoft .NET Framework e o Zend Framework do PHP 5.
Isso me traz à mente a comparação com o que li tempos atrás. A constatação — que então me impressionou — de que os mecanismos de Mapeamento Objeto-Relacional e frameworks de persistência como o Hibernate estavam fazendo a linguagem SQL se tornar commodity, vista como uma camada de “baixo nível” na interação com bancos de dados. Concordo. Eis aí mais um exemplo do aumento no nível de abstração e complexidade dos sistemas.
Para saber mais:
- REST – Representational State Transfer (em inglês), por Roger L. Costello, 2002-07-26, xFront. Veja também Building Web Services the REST Way.
- Introduction to REST (em inglês), por Bill Burke, 2008-08-18, em Javalobby DZone.
- REST (em português) e Representational State Transfer (em inglês), por Wikipédia, a enciclopédia livre.
- Uma Arquitectura Web para Serviços Web (PDF, em português), por Sérgio Nunes e Gabriel David, Universidade do Porto, Portugal, 2005-01-25 (ver catalogação e resumo).
- REST wiki (em inglês).
- Livro (em inglês) RESTful Web Services, por Leonard Richardson e Sam Ruby, 446 p., maio 2007, O’Reilly Media. Veja também RESTful Web Services: the book, Sun BabelFish Blog, 7 de junho de 2007; e Interview and Book Excerpt: RESTful Web Services (em inglês), por Stefan Tilkov, 2007-06-01.
- RESTful Web Services (PDF, em inglês), por John Cowan, 2005.
- RESTful Web Services (em inglês), por Sameer Tyagi, agosto 2006, Sun Developer Network (SDN).
- A RESTful approach to Web services (em inglês), por Robert McMillan, 2003-02-17, Network World.
- The Restful Web – How to Create a REST Protocol, por Joe Gregorio, 1º de dezembro de 2004; What Is Service-Oriented Architecture, por Hao He, 2003-09-30; e REST and the Real World, por Paul Prescod, 2002-02-20; (todos em inglês), O’Reilly XML.com.
- Relationship to the World Wide Web and REST Architectures, in: Web Services Architecture (em inglês), W3C Working Group Note, 2004-02-11. Veja também Architecture of the World Wide Web, Volume One, W3C Recommendation, 2004-12-15.
- REST != HTTP (em inglês), por Ted Neward, 2008-11-06, em seu blog; artigo também reproduzido em Javalobby.
REST em Java
Para intergrar a futura plataforma Java EE 6, em fevereiro de 2007 foi proposta a nova especificação JSR 311 – JAX-RS: The Java API for RESTful Web Services, Java Community Process (JCP). A JSR 311 teve sua versão final lançada em 2008-10-10.
Implementações de Web Services RESTful em Java:
- Jersey, implementação de referência para JSR 311, parte do projeto de software livre Glassfish em java.net. Veja também A java REST framework : Jersey (em inglês), por Christian Rivasseau, 2007-11-17.
- JSR 311 project at Java.net.
- JBoss RESTeasy (resteasy.sf.net) – JAX-RS: implementação de JSR-311. RESTful Web Services para Java usando anotações.
- Apache CFX – An Open Source Service Framework. RESTful Services: JAX-RS (JSR-311), HTTP Binding, JAX-WS Provider and Dispatch.
- Axis2/Java – RESTful Web Services Support, Apache Software Foundation.
- Restlet – Lightweight REST framework for Java.
- Gomba – Java RESTful web services.
- JRA – Java REST Annotations, em Codehaus.
Para saber mais (todos em inglês):
- REST for Java developers, Part 1: It’s about the information, stupid — A resource-oriented approach to Web services, por Brian Sletten, 2008-10-16, JavaWorld.com.
- RESTful @ Sun, putting it all together, por Alexis Moussine-Pouchkine, 2007-07-25.
- The REST of the Web (artigo), por Jason R. Briggs, 2005-04-27; e REST for Java (blog), por Shashank Tiwari, 2006-09-13; ambos em ONjava.com.
- Sun moving away from SOAP to embrace REST, por Alex Handy, 2008-10-13, SD Times. Leia também o artigo SOAP and REST – both equally important to Sun, por Arun Gupta, 2008-10-17.
Você comentou sobre o REST, mas tipo, usando SOAP eu consigo enviar uma imagem para ser armazenada num BD por exemplo, mas como eu faria isso usando REST?