Big Data/ Java/ Play Framework

#Devcommerce slides da palestra sobre Manifesto Reativo e painel Big Data

devcommerce

Wow! Adorei a primeira conferência para desenvolvedores na indústria de e-commerce.

Para quem estava buscando os slides da apresentação sobre o manifesto reativo, está disponível para baixar:
Slides da palestra.

Gostaria de agradecer toda manifestação de apoio, aplausos e perguntas realizadas no evento e pós evento, foi muito legal conhecer todos vocês e saber que o pessoal realmente se interessou pelo manifesto reativo e novas técnicas de desenvolvimento de software para a indúsitra de e-commerce.

Obrigado Tiago Baeta, pelo apoio; Toda a equipe do e-Commerce Brasil pela fantástica organização do evento, estão de parabéns.

#Goreactive!
#GoBigData

Big Data/ Java/ Play Framework/ Scala

Hangout do movimento Reativo e o Play Framework

hangout-header

Hoje mais cedo prometi no Twitter o seguinte:

Promessa é dívida, então agora no momento em que estou escrevendo o post, atingimos a marca de 10011 inscritos no movimento, ele já foi traduzido para português Brasil e Português de Portugal, estará em breve no site.

Hangout confirmado e será distribuído o video pelo Youtube como fiz com o do AngularJS.

Informações do evento
Quando será? 04 de Abril 2015 11 de Abril 2015
Preço? Gratuito
Onde? On-line na seguinte URL
Quem pode participar? Devs Scala, Java e Curiosos sobre a plataforma Reativa
Qual Conteúdo? Aprenda um pouco como criar aplicativos com o Play Framework, APIs REST e como criar sistemas de alta escalabilidade.

Compartilhe, ajude a divulgar, on-line não existe limite de participantes, da última vez do Hangout com a participação de todos, conseguimos juntar quase 1k de pesssoas ao vivo durante o evento.

 [Atualizado 30 de Março 2015] 

Devido a muitos me pedirem para mudar a data devido o feriado, mudei para o dia 11 de Abril 2015. Ajustem suas agendas por que a data mudou. E como todos estão com várias dúvidas, é melhor perguntar ao vivo do que vê apenas a gravação.

Java/ Play Framework

Play framework servindo XML e JSON ao mesmo tempo

play_framework_dicas

É comum quando você está criando sua API do zero, ter o suporte fora da caixa em JSON; Que é o padrão REST de tráfego de dados atualmente e usado por todos.

E quando sua API fala com vários players de mercado e esses players usam tecnologias diferentes? Uma boa parcela adota o JSON como padrão, já outras ainda estão amarrados ao XML. Tudo por causa do legado deixado. À exemplo disso, tem muita empresa que ainda usa Oracle 9g e 10g que não tem suporte padrão ao JSON por parte da Oracle, tendo que depender de packages de terceiros.

Teorias a parte, ainda tem muito software antigo em uso que fizeram implementação SOAP 1.1 e pararam por ai, difícil você convencer um player a mudar a sua saída para consumir nossos serviços. O interessante seria você dar a solução e criar uma interface que deixe o cliente o mais confortável possível para ele conseguir se comunicar com sua API.

Ter suporte a XML é uma forma natural de todos falarem naturalmente com seus serviços e o sucesso da integração completa é quase certo.

Enfim, o Play Framework dá suporte a saída XML e JSON nativamente fora da caixa. O problema existe quando você quer servir ambas as coisas em uma única requisição.

Para você conseguir nesse ponto, basta você interceptar qual o Content-Type da chamada e assim direcionar o uso para o formato requisitado.

package controllers;
 
import com.fasterxml.jackson.databind.node.ObjectNode;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Result;
 
/**
 * Created by igorcosta on 14/01/15.
 */
public class BlogController extends Controller {
 
    private static final String RESPONSE_APPLICATION_XML_TYPE = "application/xml";
    private static final String RESPONSE_XML_TYPE = "text/xml";
    private static final String RESPONSE_APPLICATION_JSON_TYPE = "application/json";
 
 
    public static Result ola() {
        String headerType = request().getHeader("Content-Type");
        String retorno = null;
        if (headerType.contains(RESPONSE_APPLICATION_XML_TYPE) ||
                headerType.contains(RESPONSE_XML_TYPE)) {
 
            if (headerType.equals(RESPONSE_APPLICATION_XML_TYPE)) {
 
                response().setContentType(RESPONSE_APPLICATION_XML_TYPE);
            } else {
                response().setContentType(RESPONSE_XML_TYPE);
            }
            // Use any java lib to generate a better xml 
            retorno = "Ola Mundo";
 
        } else if (headerType.contains(RESPONSE_APPLICATION_JSON_TYPE)) {
            // Serving just plain json
            ObjectNode result = Json.newObject();
            result.put("mensagem","Ola Mundo");
            retorno = result.toString();
        }
 
        return ok(retorno);
    }
}

Screenshot from 2015-01-14 12:29:03

Você interceptando o tipo do conteúdo da chamada, você pode servir os dois formatos.

Como o Play faz o auto-generate do Header da chamada, é importante também sobrescrever o retorno da chamada, caso contrário você tem um retorno em pleo text/plain.

Java/ Play Framework

Habilitando CORS no Play Framework 2.3.x

wired

É bem comum quando você trabalha com diferentes servidores e recursos separados por uma vasta rede de servidores, ou você contorna isso usando Nginx, proxies ou você implementa uma abordagem diferente quando chega nesse nível.

CORS, basicamente é o problema mais comum em lhe dar com chamadas AJAX hoje em dia, por exemplo esse post foi inspirado nessa necessidade.

No Play Framework você samba um pouquinho para conseguir adicionar suporte a CORS nas chamadas que forem executadas por lá.

Para quem usa Tomcat, pode usar o filtro que o Ebay disponibilizou no Github.

Como funciona no Play?

Crie um arquivo na pasta Raiz:Global.java

 
import play.GlobalSettings;
import play.libs.F.Promise;
import play.mvc.Action;
import play.mvc.Http;
import play.mvc.SimpleResult;
 
public class Global extends GlobalSettings {
    private class ActionWrapper extends Action.Simple {
        public ActionWrapper(Action<?> action) {
            this.delegate = action;
        }
 
        @Override
        public Promise<SimpleResult> call(Http.Context ctx) throws java.lang.Throwable {
            Promise<SimpleResult> result = this.delegate.call(ctx);
            Http.Response response = ctx.response();
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setHeader("Access-Control-Allow-Methods", "POST, HEAD, PATCH, GET, PUT, DELETE, OPTIONS");
            response.setHeader("Access-Control-Allow-Credentials", "true");
            response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
            return result;
        }
    }
 
    @Override
    public Action<?> onRequest(Http.Request request, java.lang.reflect.Method actionMethod) {
        return new ActionWrapper(super.onRequest(request, actionMethod));
    }
}

Salve e execute qualquer chamada REST que você tenha de serviço no Play, o cabeçalho agora aparecerá para você assim:

 
 
    Status Code: 200 OK
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
    Access-Control-Allow-Methods: POST, HEAD, PATCH, GET, PUT, DELETE, OPTIONS
    Access-Control-Allow-Origin: *
    Content-Length: 3322
    Content-Type: application/json; charset=utf-8

Fácil né? Para chegar até aqui foi complicado, então deixo aqui o registro para futuros devs Java que tiverem esses problemas para resolver de forma mais rápida que eu.

Até o próximo post, dúvidas, deixem seus comentários.