REST. Nao esqueca de incluir uma regra Parm com os parametrosparm(&EmpresaId);3) Definindo as propriedades do DPAlem de definir o Output como Collection=true, tambem sera necessario expor o objeto como Servico REST.4) Montando o clienteUma segunda KB ou qualquer programa externo podera consultar nosso DP REST, e claro, mantendo o mesmo esquema de protecao do GAM, o cliente devera realizar primeiramente o login, para em seguida poder executar o DP. Uma chamada ao servico /oauth, passando-se os parametros corretos, realiza a proposta. Como informamos no artigo anterior o client_id e obtido no GamHome.sub 'login' &httpclient.Host = 'localhost/' &httpclient.Port = 80 &httpclient.BaseUrl = '/Kb.NetEnvironment/oauth/' &addstring ='client_id=068868de058b4798bd3b90f696fa37f8&grant_type=password&scope=FullControl&username=admin&password=admin123' &httpclient.AddHeader("Content-Type", "application/x-www-form-urlencoded") &httpclient.AddString(&addstring) &httpclient.Execute('POST','access_token') &AccessTokenSDT.FromJson(&httpclient.ToString()) &websession.set('TOKEN', &AccessTokenSDT.access_token)EndSubPara completar o processo de login e necessario obter o token, e para isto programamos o AccessTokenSDT que formata a respota do GAM. Se estivermos tratando de Genexus para Genexus, os objetos podem ser exportados e importados na Kb cliente, porem, para outros ambientes teremos que definir, na linguagem especifica a respectiva estrutura.Armazenamos o Token na sessao para poder acessar seu valor quando necessario.&websession.set('TOKEN', &AccessTokenSDT.access_token)A chamada ao Data Provider deve ser realizado passando-se o token.&httpclient.AddHeader('Authorization','OAuth ' + &websession.get('TOKEN'))Em seguida uma variavel querystring e programada para informar o parametro a ser passado. Observe que o parametro deve ser declarado neste modelo, "?EmpresaId=" + trim(&EmpresaId.ToString()). O Data Provider e incluido no querystring, empresadp.&querystring='empresadp' + "?EmpresaId=" + trim(&EmpresaId.ToString())O codigo completo da chamada e apresentado a seguir.Event Enter do 'login' &httpclient.Host = 'localhost/' &httpclient.Port = 80 &httpclient.BaseUrl = '/Kb.NetEnvironment/rest/' &httpclient.AddHeader('content-type','application/json') &httpclient.AddHeader('Authorization','OAuth ' + &websession.get('TOKEN')) &querystring='empresadp' + "?EmpresaId=" + trim(&EmpresaId.ToString()) &httpclient.Execute('GET', &querystring) &resposta = &httpclient.ToString()EndeventPara transformar a resposta em uma variavel SDT e possivel desde que definido. Fizemos isto no primeiro passo, ao criar o EmpresaSDT. Sera necessario e transferir o objeto da Kb onde se encontra o Data Provider para a Kb cliente.Uma variavel do tipo EmpresaSDT deve ser criada como Collection=true. E, em seguida, um FromJson resolvera a parada.&EmpresaSDT.FromJson(&httpclient.ToString())O resultado disso? temos os registros recuperados da tabela Empresa, filtrados pela variavel &EmpresaSDT. Desta forma podemos 'consultar' esta tabela em memoria, na maquina cliente.Fechando a contaTemos muitos recursos interessantes que poderemos utilizar para solucionar nossos problemas de programacao. O uso de webservices e importante porque toda logica de protecao dos dados se encontra sob o dominio da Kb que fornece o servico. Diferentemente de um acesso direto a tabela, por meio de um DataView, os webservices permitem um maior controle sobre o acesso e autorizacoes sobre as operacoes que cada sistema cliente tera.Talvez nao sirva para todas as situacoes, mas com certeza, para cenarios de multiplos sistemas que necessitam trocar informacoes e uma excelente aposta.Maiores informacoes:http://wiki.genexus.com/commwiki/servlet/wiki?30737,HowTo%3A+Consuming+a+Rest+Data+Provider, http://wiki.genexus.com/commwiki/servlet/wiki?28213,Toc%3ARest+web+services+in+GeneXus,http://wiki.genexus.com/commwiki/servlet/wiki?20977,Consuming+REST+Data+Providers+in+Genexus, Acesso aos exemplos, formato XPZ:REST_Servicos: Kb fornecedora dos dadosREST_Cliente: Kb cliente que chama o Data Provider.Gerador:.Net a chamada ao servico REST nao precisa obedecer rigorosamente o nome do DP, podendo ser utilizado letras maiusculas ou minusculasJava exige que o nome do servico obedeca o case das fontes.