Contract-First em REST
A respeito de implementação de serviços a maioria das vertentes que você ouvirá hoje se dividirão entre serviços SOAP e serviços REST.
Após a minha doutrinação em SOA sempre vi com bons olhos a prática de desacoplamento entre a lógica de implementação e a interface de consumo do usuário. Para solucionar esse problema nós utilizamos uma técnica conhecida como Contract-First (ou no horrível português Contrato Primeiro — Quando falo horrível português me refiro ao fato de para mim haverem palavras, frases e expressões que não deveriam ser traduzidas como layout, mas enfim…)
Confesso que quando do início do meu desenvolvimento em REST o que sempre me causava uma certa aversão, ainda que o SOAP fosse mais verborrágico ou despendesse maior processamento era o fato de o conceito de Contract-First me ter sido passado como exclusividade do SOAP.
Basicamente podemos entender o Contract-First como criar a interface de manipulação do serviço antes do código em si, em SOAP seria basicamente criar seu modelo canônico (XSDs) e os WSDLs, utilizar algum mecanismo para geração de entidades e capacidades a partir do mesmo; gosto muito da implementação CXF/ Maven para a geração de classes e serviços a partir do plugin cxf-codegen-plugin.
Através da aplicação do Contract-First e geração das classes envolvidas o que precisará ser feito é a implementação dos métodos gerados dos serviços para poder publicar os mesmos, com isso, não haverá acoplamento com o código, os tipos de dados utilizados serão padrões de mercado, a evolução do serviço se dá mais facilmente.
Quando eu disse “Confesso que quando do início do meu desenvolvimento em REST o que sempre me causava uma certa aversão” o tempo verbal dessa frase é o passado por ter conhecido há algum tempo o RAML. Uma vez conhecedor disso, minha abordagem quanto a REST mudaram, uma vez que eu poderia utilizar todas as vantagens que o Contract-First me proporciona.
No projeto em questão testei a implementação com CXF, Spring e Gradle. A grande dificuldade na implementação para Java foi que não consegui na época uma task que gerasse automaticamente o código como no caso do plugin cxf-codegen-plugin para Maven, precisei instalar um plugin no próprio Eclipse para isso (não sei se o suporte já foi adicionado para Gradle).
De qualquer forma, uma das grandes vantagens que vi além do Contract-First foi a documentação do serviço através de outra implementação. Isso facilitava ainda mais a minha vida no que diz respeito a atualização daquela documentação em papel que “insiste em estar desatualizada” quando das alterações do serviço.
Hoje fui ler uma matéria bem interessante publicada pela Caelum sobre o Swagger: Documentando uma API JAX-RS com Swagger.
Enfim, fica a dica para desenvolvedores REST