Interfaces de Serviço na Prática Luciano Oliveira Sr. Instructor, Consultant Global Field Services
Antes de começarmos Iniciando do princípio 2
Antes de começarmos Let me tell you a story 3
Antes de começarmos Let me tell you a story 4
Antes de começarmos 5
Antes de começarmos 6
Antes de começarmos Let me tell you a story 7
Agenda Revisão da Arquitetura de Referência OpenEdge Requisitos para Interfaces de Serviço Interfaces de Serviço na Prática OpenEdge GUI WebSpeed UI.NET UI Web services Sonic 8
Arquitetura de Referência OpenEdge Apresentação Serviços de Negócio Acesso a Dados Fontes de Dados Serviços Corporativos Infra-estrutura Comum 9
Interfaces de Serviço De um perspectiva funcional Dispositivos Wireless Relatórios Corporativos Quiosque de Informações B2C Portal Web B2C Camada de Serviços de Negócio Aplicações de Back Office Serviços de Colaboração B2B Integração A2A API aberta 10
Interfaces de Serviço a um ponto de vista técnico.net CF usando Web Services Crystal Xi usando proxy.net.net usando proxy.net OpenEdge WebSpeed OpenEdge AppServer GUI OpenEdge Sonic ESB Sonic MQ Web Services 11
Arquitetura de Referência OpenEdge Interface de Serviços Interface de serviços e utilitários de ambiente Entidades de Negócio Tarefas de Negócio Fluxos de Negócio 12
Interface de Serviços - Definição Uma Interface de Serviços é uma API que é exposta ao mundo externo. Esta API serve como uma ponte entre a camada de Serviços de Negócio e as camadas de Apresentação e/ou Integração. 13
Agenda Revisão da Arquitetura de Referência OpenEdge Requisitos para Interfaces de Serviço Interfaces de Serviço na Prática OpenEdge GUI WebSpeed UI.NET UI Web services Sonic 14
Chamando a lógica de negócios Conectar à lógica de negócios Executar lógica de negócios 15
Passos adicionais Gerenciamento de sessão Gerenciamento de Contexto Segurança Auditoria Serviço de Diretório 16
Chamando a lógica de negócios Conecta à lógica de negócios Gerenciamento de sessão Gerenciamento de contexto Verificações de segurança Atividades de auditoria Encontrar/iniciar lógica de negócio Executar lógica de negócio 17
Responsabilidades do Cliente Conexão ao AppServer É preciso conectar ao AppServer? Como se conecta ao AppServer? Contexto do cliente O cliente pode manter informações de sessão, contexto ou segurança? Podemos controlar e confiar no contexto do lado cliente? 18
Responsabilidades do Cliente Segurança do cliente Como os clientes se autenticam? É possível tomar um token de sessão para validar a identidade ou faz-se necessária a autenticação a cada requisição? Podemos utilizar credencials de cliente (client principals)? Suporte a ProDataSets O cliente pode enviar e receber estruturas do tipo DataSet? O cliente pode enviar dados de tabelas Before/After? 19
Agenda Revisão da Arquitetura de Referência OpenEdge Requisitos para Interfaces de Serviço Interfaces de Serviço na Prática OpenEdge GUI WebSpeed UI.NET UI Web services Sonic 20
OpenEdge GUI Conexão direta ao AppServer Pode manter contexto de cliente Login / ID da sessão Dados do Contexto Suporta credenciais (principals) do cliente Suporte nativo a ProDataSets Escrito em ABL Capaz de realizar chamadas assíncronas ao AppServer 21
Interface de Serviços OpenEdge GUI Conecta-se ao AppServer Passa o Id da Sessione e outras informações de contexto Passa parâmetros para a requisição Pode conter DataSets Recupera sessão/contexto Verifica segurança Retorna resultados ao cliente Pode conter DataSets 22
Interface de Serviços OpenEdge: carfetchwhere.p {autoedge/dscar.i} {services/dscontext.i} {services/dsnull.i} DEFINE INPUT PARAMETER pcentityname AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pcoperationname AS CHARACTER NO-UNDO. DEFINE INPUT-OUTPUT PARAMETER DATASET FOR dscontext. DEFINE OUTPUT PARAMETER DATASET FOR dscar. DEFINE INPUT-OUTPUT PARAMETER DATASET FOR dsnull. DEFINE OUTPUT PARAMETER pcexcstatus AS CHARACTER NO-UNDO. DEFINE VARIABLE hdataset AS HANDLE NO-UNDO. RUN support/prosigateway.p ( INPUT "Car", INPUT "fetchwhere", INPUT-OUTPUT DATASET dscontext BY-REFERENCE, OUTPUT DATASET-HANDLE hdataset, INPUT-OUTPUT DATASET dsnull BY-REFERENCE, OUTPUT pcexcstatus ). IF NOT pcexcstatus > "" THEN DO: DATASET dscar:copy-dataset (hdataset). END. RETURN. 23
Interface de Serviços OpenEdge GUI /* service interface for customer SaveChanges */ DEFINE INPUT PARAMETER pcentityname AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pcoperationname AS CHARACTER NO-UNDO. DEFINE INPUT-OUTPUT PARAMETER DATASET-HANDLE phcontext. DEFINE OUTPUT PARAMETER DATASET-HANDLE phoutputdataset. /* used for fetching data */ DEFINE INPUT-OUTPUT PARAMETER DATASET-HANDLE phdscustomer. /* used for updates */ DEFINE OUTPUT PARAMETER pcexcstatus AS CHARACTER NO-UNDO. RUN restoresessionandcontext (INPUT-OUTPUT DATASET-HANDLE phcontext BY-REFERENCE). RUN checkpermission (INPUT pcentityname, INPUT pcoperationname, OUTPUT lexecuteallowed, INPUT-OUTPUT DATASET-HANDLE phcontext BY-REFERENCE). IF NOT lexecuteallowed THEN LEAVE. 24
Interface de Serviços OpenEdge GUI RUN getoperationdetails (INPUT pcentityname, INPUT pcoperationname, OUTPUT hentity, OUTPUT cprocedurename, OUTPUT linputoutput). /* call method with appropriate INPUT-OUTPUT or OUTPUT parameters */ IF linputoutput THEN DO: RUN VALUE (cprocedurename) IN hentity (INPUT-OUTPUT DATASET-HANDLE phiodataset BY-REFERENCE). END. ELSE DO: RUN VALUE (cprocedurename) IN hentity (OUTPUT DATASET-HANDLE phoutputdataset). END. RUN errorandexceptionhandling (OUTPUT pcexcstatus). RETURN. 25
OpenEdge WebSpeed Modelo cliente/servidor complexo Web browser agente WebSpeed Código WebSpeed camada de Serviços de Negócio Datasets Não suportados em telas HTML Suportados em código WebSpeed Sessão/contexto do cliente (em ambos os clientes ) Login / Id da sessão Contexto do cliente Escrito em ABL 26
Interface de Serviços OpenEdge WebSpeed Mapeia requisições HTML a ABL Forms, variáveis de browser, parâmetros de URL, cookies Pode precisar da criação de Before/After tables para os ProDataSets Conecta-se ao AppServer Ou executa a lógica de negócios na mesma sessão Recupera sessão/contexto Verifica segurança Mapeia os resultados de volta para HTML 27
Interface de Serviços OpenEdge WebSpeed RUN setcontext (INPUT 'wherestring':u, INPUT cwherestring, INPUT '':U). RUN setcontext (INPUT 'batchsize':u, INPUT pibatchsize, INPUT '':U). RUN calloperation (INPUT 'Car':U, INPUT 'fetchcar':u, INPUT-OUTPUT DATASET dscontext BY-REFERENCE OUTPUT DATASET dscar, INPUT-OUTPUT DATASET-HANDLE hnulldataset ). 28
Interface de Serviços OpenEdge WebSpeed PROCEDURE calloperation [ ] RUN checkpermission (INPUT pcentityname, INPUT pcoperationname, OUTPUT lexecuteallowed, INPUT-OUTPUT DATASET-HANDLE phcontext BY-REFERENCE). IF (NOT lexecuteallowed) OR (phcontext:error = TRUE) THEN RETURN. RUN getoperationdetails (INPUT pcentityname, INPUT pcoperationname, OUTPUT hentity, OUTPUT cprocedurename, /*fetchwhere/savechanges*/ OUTPUT linputoutput). RUN VALUE (cprocedurename) IN hentity (INPUT-OUTPUT DATASET-HANDLE phiodataset). END. ELSE DO: RUN VALUE (cprocedurename) IN hentity (OUTPUT DATASET-HANDLE phoutputdataset). END. [ ] 29
Open Client.NET Conecta-se ao AppServer através de proxies Sessão/contexto do cliente Login / Id da Sessão Contexto do cliente Suporte a Datasets Escrito em C#, J#, VB.NET Tipicamente as equipes de desenvolvimento de UI e de backened são separadas Tipicamente Interfaces de Serviço estáticas 30
Interface Open Client.NET Conecta-se ao AppServer através de proxy Passa Id da sessão e outros dados de contexto Pass parâmetros para a requisição Pode conter Datasets Recupera sessão/contexto Verifica segurança Retorna resultados ao cliente Pode conter Datasets 31
Interface de Serviços UI.NET public void GetCars (string sessionid, string modelid, out dscardataset.ecardatatable dtresult) { } Progress.Autoedge.StrongTypesNS.dsCarDataSet dscars = null; Progress.Autoedge.StrongTypesNS.dsContextDataSet dscontext = new Progress.Autoedge.StrongTypesNS.dsContextDataSet(); Progress.Autoedge.StrongTypesNS.dsNullDataSet dsnull = new Progress.Autoedge.StrongTypesNS.dsNullDataSet(); string status = string.empty; dscontext.ttcontext.addttcontextrow(string.empty, "sessionid", sessionid); dscontext.ttcontext.addttcontextrow(string.empty, "wherestring", string.empty); Proxy.carfetchwhere(string.Empty, string.empty, ref dscontext, out dscars, ref dsnull, out status); if (dscars.ecar.haserrors == true) Handle(dsCars.eCar.GetErrors()); if (dscars.ecar.rows.count <= 0) throw new InvalidOperationException(); dtresult = dscars.ecar; 32
Cliente Web Services Datasets Datasets não podem ser expostos a Web Services Before/After tables não são suportados em Web Services Tipicamente não há conhecimento sobre o cliente Não há informação de sessão/contexto de cliente Segurança limitada (e.g. não há login) Cliente normalmente não tem conhecimento sobre backend Precisa de serviços de granularidade fina, autodocumentados 33
Interface de Serviços Web Services Conecta-se ao AppServer através do Web Services Adapter Passa informação de login Valida login Passa informações de contexto/sessão Parâmetros podem ter de ser mapeados em Datasets Datasets devem ser quebrados em temp-tables A lógica de negócios é chamada Business logic 34
Interface de Serviços Web Services PROCEDURE fetchtestdrives : /*------------------------------------------------------------------------------ Purpose: Returns an XML list of Open TestDrives Parameters: INPUT UserId INPUT Password OUTPUT Temp-Table for TestDrives ------------------------------------------------------------------------------*/ DEFINE INPUT PARAMETER pcusername AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pcuserpassword AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER TABLE FOR etestdrivews. EMPTY TEMP-TABLE ttcontext. CREATE ttcontext. ASSIGN ttcontext.contextname = "UserLoginName":U ttcontext.contextvalue = pcusername. CREATE ttcontext. ASSIGN ttcontext.contextname = "UserLoginPass":U ttcontext.contextvalue = pcuserpassword. RUN serviceinterface/prosigui2.p (INPUT "TestDriveWS":U, INPUT "fetchopen":u, INPUT-OUTPUT DATASET dscontext BY-REFERENCE, OUTPUT DATASET-HANDLE hdataset, INPUT-OUTPUT DATASET dsnull BY-REFERENCE, OUTPUT pcexcstatus ). END PROCEDURE. 35
Interface de Serviços Web Services public class autoedgeobj : System.Web.Services.Protocols.SoapHttpClientProtocol { [ ] } public autoedgeobj() { this.url = "http://localhost/wsa/wsa1"; } [ ] public string CreatePO_webservicesi() { object[] results = this.invoke("createpo_webservicesi", new object[0]); return ((string)(results[0])); } public System.IAsyncResult BeginCreatePO_webservicesi( System.AsyncCallback callback, object asyncstate) { return this.begininvoke("createpo_webservicesi", new object[0], callback, asyncstate); } public string EndCreatePO_webservicesi( System.IAsyncResult asyncresult) { object[] results = this.endinvoke(asyncresult); return ((string)(results[0])); } 36
Integração com Cliente Sonic Dataset Datasets não podem ser enviados em mensagens Before/After tables não são suportadas Tipicamente não há conhecimento sobre o cliente Normalmente o cliente não tem conhecimento sobre o backend Deve ser apenas uma mensagem publicada Não há resposta direta 37
Integração com Cliente Sonic Recebe a mensagem Mensagem pode ter de ser mapeada em Datasets Passa informação de login Valida login Passa informações de contexto/sessão Chama-se a lógica de negócios 38
Interface de Serviços Sonic 39
Em suma Interfaces de serviço Conectam diferentes tecnologias Implementam serviços principais Devem ser criadas para cada tipo de cliente 40
Perguntas? 41
42