Upload
rodrigo-candido-da-silva
View
920
Download
0
Embed Size (px)
Citation preview
Alternativas ao Desenvolvimento do Back-end Mobile com
Java EE Rodrigo Cândido da Silva
@rcandidosilva http://about.me/rcandidosilva
Agenda
! Mobile Platform ! Mobile Clients ! RESTful ! WebSocket ! Plataforma Java EE
! JAX-RS ! Java API for WebSocket
! iOS ! Android ! DEMO !!!
Mobile Platform
Mobile Clients
Mobile Clients ! Web Apps
! Aplicações server-side que rodam no navegador web do dispositivo ! HTML 5, CSS 3, JavaScript ! jQuery Mobile, Sencha Touch ! Web designs responsivos e adaptativos
! Hybrid Apps ! Desenvolvida utilizando tecnologias web, mas são executadas como uma aplicação
nativa através de um container nativo (wrapper) ! PhoneGap, ADF Mobile, IBM Worklight, AeroGear, Appcelerator
! Native Apps ! Desenvolvida para uma plataforma específica ! Aplicação instalada ! Object-C/xCode, Java/Eclipse etc
Conectividade Client/Server
! RESTful ! Comunicação através do HTTP utilizando REST style ! Leve, stateless e escalável ! Utiliza tipicamente JSON over HTTP.
! XML também pode ser utilizado
! Cliente inicia a requisição ! Utiliza verbos HTTP como GET, POST, PUT, DELETE ! Utiliza as tecnologias web existentes
RESTful
RESTful
Conectividade Client/Server
! WebSockets ! Oferece comunicação bi-direcional (full-duplex) através
de uma simples conexão TCP ! Inicia através de um hand-shake através do protocolo
HTTP, mas as conversações utilizam o protocolo WebSockets.
! Suporte requisições assincronas ! Perfeito para aplicações como chat e jogos ! Utiliza as tecnologias web existentes
WebSocket
Server Client
Connected !
open open
close
message
message
error
message message
Disconnected
WebSocket
Web
Soc
ket
End
poin
t
Client
Client
Client
Remote Endpoint
Remote Endpoint
Remote Endpoint
Session
Message Handler
Session
Message Handler
Session
Message Handler
Internet
Java Enterprise Edition
Java Enterprise Edition
! Suporte ao desenvolvimento de aplicações “enterprise” ! Aplicações distribuídas, seguras, escaláveis, de alta
disponibilidade e com baixo custo de manutenção
! Plataforma para desenvolvimento de software de pequeno, médio e grande porte em múltiplas camadas de componentes ! Componentes “rodam” em um servidor Java EE
Java EE History
J2EE 1.3 CMP, Connector Architecture
J2EE 1.4 Web Services Mgmt, Deployment, Async Connector
Java EE 5 Ease of Development, EJB 3, JPA, JSF, JAXB, JAX-WS, StAX, SAAJ
Java EE 6 Pruning, Extensibility Ease of Dev, CDI, JAX-RS
Web Profile Servlet 3, EJB 3.1 Lite
Java EE 7 JMS 2, Batch, TX, Concurrency, Interceptor, WebSocket, JSON
Web Profile JAX-RS 2
JAX-RPC, CMP/ BMP, JSR 88
Java EE / Mobile
EJB 3
Servlet
CDI
JPA
JAX-RS
Bean Validation
Java API for WebSocket
Java API for JSON
JMS JTA
Mobile Device
JAXB
JCA
JAX-RS
! REST development API for Java ! Server and client ! Programação declarativa com anotações
! @Path, @GET, @POST, @PUT, @DELETE, @PathParam, @QueryParam, @Produces, @Consumes
! Plugável e extensível ! Providers, filters, interceptors
Exemplo JAX-RS (1)
@Path("/atm/{cardId}") public class AtmService { @GET @Path("/balance") @Produces("text/plain") public String balance( @PathParam("cardId") String card, @QueryParam("pin") String pin) { return Double.toString(getBalance(card, pin)); } ...
Exemplo JAX-RS (2)
... @POST @Path("/withdrawal") @Consumes("text/plain") @Produces("application/json") public Money withdraw( @PathParam("card") String card, @QueryParam("pin") String pin, String amount) { return getMoney(card, pin, amount); } }
Java API for WebSocket
! Programação declarativa com anotações ! Client and server-side ! Powerful API
! @ServerEndpoint, @OnOpen, @OnClose, @OnMessage, @OnError, Session, Remote
! Plugável e extensível ! Encoders, decoders, sub-protocols
! Lifecycle callback handlers ! Permite empactá-los em aplicações Java EE
Exemplo WebSocket (1)
@ServerEndpoint("/chat") public class ChatBean { Set<Session> peers = Collections.synchronizedSet(…); @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } ...
Exemplo WebSocket (2)
... @OnMessage public void message(String message, Session client) { for (Session peer : peers) { peer.getRemote().sendObject(message); } } }
iOS
! Fornece suporte nativo para REST e JSON ! Existem bibliotecas externas como RestKit
! Não possui suporte nativo à WebSocket ! Pode-se utilizar bibliotecas externas como
SocketRocket ! SSL é suportado para conexões REST e
WebSocket
iOS com RestKit
! RestKit ! http://restkit.org
! Apache License ! Core Data Support ! Object Mapping ! Pluggable Parser ! MIME types, multi-part requests
iOS com SocketRocket
! OpenSource library para WebSocket ! http://github.com/square/socketrocket
! Apache 2.0 License ! Suite para testes de regressão ! Suporte WebSockets seguros ! Implementação através de proxy
! SRWebSocketDelegate
! Simples integração para com os projetos
iOS com SocketRocket
! Delegate Methods ! Message Message Callback
! (void)webSocket:(SRWebSocket*)webSocket didReceiveMessage:(id)message;
! WebSocket Open Operation ! (void)webSocketDidOpen:(SRWebSocket*)webSocket;
! WebSocket Connection Failed ! (void)webSocket:(SRWebSocket*)webSocket didFailWithError:(NSError*)error;
! WebSocket Failed ! (void)webSocket:(SRWebSocket*)webSocket didCloseWithCode:(NSInteger)codereason:(NSString*)reason wasClean:(BOOL)wasClean;
iOS com SocketRocket
! Open Connection
! Close Connection
Android ! Suporte nativo Apache HTTPClient ! Suporte nativo JSON libraries
! Jackson ! GSON
! Bibliotecas externas para suporte REST ! Spring Android RestTemplate ! RESTDroid ! JAX-RS/Jersey Client APIs on Android
! Bibliotecas externas para WebSocket ! Autobahn Android ! Android WebSockets from CodeButler ! WebSocket/Tyrus Client APIs on Android
Spring Android RestTemplate
RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new
MappingJacksonHttpMessageConverter()); restTemplate.getMessageConverters().add(new
StringHttpMessageConverter());
ResponseEntity<ToDoResponse> response = ResponseEntityrestTemplate.exchange( urlStr, HttpMethod.POST,
new HttpEntity<ToDoItem>(todoItem, httpHeaders), ToDoResponse.class );
Autobahn WebSockets Client private final WebSocketConnection mConnection = new WebSocketConnection(); ... mConnection.connect(wsuri, new WebSocketHandler() {
@Override public void onOpen() { mConnection.sendTextMessage("Hello, world!"); } @Override public void onTextMessage(String payload) { Log.d(TAG, "Got echo: " + payload); } @Override public void onClose(int code, String reason) { Log.d(TAG, "Connection lost."); } });
Demonstração
! Github
! http://github.com/rcandidosilva/javaee-mobile
Boas Práticas ! REST vs. WebSocket
! REST para maioria das situações, WebSocket apenas para comunicações full-duplex, bidirecionais
! JSON vs. XML ! JSON é a melhor opção
! Aonde deve-se armazenar os dados ! Geralmente no client-side, sincronizando/persistindo no server-side
! API design ! Coarse grained, stateless, general purpose
! Security ! TLS, federated (OAuth), evite dados confidenciais no client-side
! Development model ! Native -> Hybrid -> HTML 5?
Perguntas e Respostas
?
Iniciativas
! Eventos mensais; ! Blog; ! Redes sociais; ! Listas de discussão; ! Organização de eventos; ! Projetos open source; ! …
Como Colaborar
! Blog: ! http://www.gujavasc.org
! Facebok: ! https://www.facebook.com/groups/gujavasc
! Twitter ! https://twitter.com/gujavasc
! Google+ ! https://plus.google.com/communities/102439827020596326242
! Github ! https://github.com/gujavasc