sábado, 2 de abril de 2011

Estou conectado?

Recentemente passei por uma situação interessante, isso porque há muito tempo não programava Win Forms, e por uma determinada questão do projeto, necessitava saber se em determinado instante o sistema estava ou não conectado à Internet. Para a maioria dos desenvolvimentos de soluções Web, esse pequeno detalhe nem é levado em conta, mas em uma aplicação Win que é executado localmente, nesse meu caso, era interessante saber.

GeneXus oferece um tipo bem interessante que é o HttpClient que permite obter o resultado de uma chamada a uma URL qualquer na Web. No exemplo programado temos uma chamada ao google.com, e a resposta pode ser tratada pela leitura do valor de ErrCode. O resultado de ErrCode = 0 significa que não houveram erros.

&HttpClient.Execute("GET", http://www.google.com)
&itsconnected = iif(&HttpClient.ErrCode=0,1,0)

Ao terminar a chamada a variável &itsconnected receberá o valor 1 para o caso de haver conexão, e zero para não.

Esse código bastante enxuto pode ser traduzido em C#, e usando o recurso de programação nativa do GeneXus, poderiamos escrever algo como:


csharp System.Net.HttpWebRequest req;
csharp System.Net.HttpWebResponse resp;
csharp try {
csharp string url = @"http:"+"/"+"/"+"www.google.com/";
csharp req = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url);
csharp resp = (System.Net.HttpWebResponse)req.GetResponse();
csharp if(resp.StatusCode.ToString().Equals("OK")) {
csharp [!&itsconnected!] = 1;
csharp }
csharp else {
csharp [!&itsconnected!] = 0;
csharp }
csharp } catch(Exception exc) {
csharp [!&itsconnected!] = 0;
csharp }

Observe a grafia para se fornecer o endereço http://www.google.com, no código nativo, isso devido ao problema de newline in constant gerado pelo compilador C#.

Veja que GeneXus suporta os dois modelos de programação, mas se compararmos, fica nítido o quanto GeneXus de fato nos facilita a vida, não é?

 

5 comentários:

Anônimo disse...

legal, me ajudou muito aqui!
obrigado! ;)

Anônimo disse...

Muito bom.
Você teria um exemplo de como consumir um webservice com HttpClient (sem utilização de wsdl inspector) ?
Obrigado.

Douglas Hamilton de Oliveira disse...

Caro Anonimo,
Voce encontra exemplos em: http://www.genexando.com/2011/11/geolocalizacao-pelo-ip-com-httpclient.html e http://www.genexando.com/2011/11/consulta-cep.html.
Ambos nao utilizam o wsdl inspector.
ab

Anônimo disse...

Mas dá pra escrever bem menos que isso no c#, sem contar que seu código tem declarações de variável, que no genexus vc "cadastra" por isso não aparecem no código, tem contexto global, induzem a erros e consomem mais memoria ...
Mas infelizmente tenho que trabalhar com esse genesio então esta sua dica foi útil. Obrigado.

Douglas Oliveira disse...

Você pode utilizar classes C# ou Java, criadas externamente ao Genexus, importando-as como objetos nativos, e assim otimizar processos que no Genexus ficariam 'mais extensos'. De uma olhada em http://www.genexando.com/2013/06/md5-com-external-object.html, que tem um exemplo que importa uma DLL externa. Mas cuidado, soluções iguais a esta acabam limitando sua capacidade de migrar para outras linguagens.
ab