En muchas ocasiones cuando nos encontramos desarrollando diferentes tipos de módulos o aplicaciones nos topamos con diversos problemas o funciones para las cuales necesitamos ayuda externa o algún pequeño ejemplo el cual nos dé una idea de cómo dar solución al problema que nos topamos.
Esta es una duda la cual me surgió al programar una función la cual se encargaba de obtener el valor del dólar de manera actualizada.
Para la cual me di a la tarea de buscar algún servicio en línea o página web de la cual pudiese obtener esta información, después de unas horas de buscar llegue a encontrar un sitio web el cual le podemos suministrar el código de dos monedas y obtendremos un XML con el valor de la moneda UNO convertida a la moneda DOS.
Haciendo Clic en el siguiente enlace podremos acceder al sitio web CurrencyConvertor:
http://www.webservicex.net/CurrencyConvertor.asmx?op=ConversionRate
Navegando en la página web encontraremos las diferentes tipos de peticiones al servidor y su correspondiente resultado.
- SOAP 1.1
- SOAP 1.2
- HTTP GET
- HTTP POST
De todas estas usaremos el HTTP GET para el cual solo se necesitara pasar el código de la moneda que se convertirá y el código de la moneda a la que se convertirá.
1 |
http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=USD&ToCurrency=MXN |
Como podemos observar en la liga anterior estamos solicitando el servidor del sitio web que nos regrese al valor de 1.00 dólar en Pesos Mexicanos, y como respuesta obtendremos un XML con el valor dentro de una etiqueta de tipo double.
1 |
<double>15.7259</double> |
Posteriormente debemos implementar en nuestro proyecto de c# una función a la cual le proporcionaremos una URL y devolverá una cadena de texto de la cual extraeremos el valor necesitado.
1 2 3 4 5 6 7 8 9 10 |
private string getHTTP(string szURL) { HttpWebRequest httpRequest = null; HttpWebResponse httpResponse = null; string bodyText = ""; Stream responseStream = null; Byte[] RecvBytes = new byte[byte.MaxValue]; Int32 bytes; return bodyText; } |
HttpWebRequest httpRequest
En esta implementaremos la petición HTTP con la cual realizaremos la solicitud.
HttpWebResponse httpResponse
En esta implementaremos la respuesta HTTP que obtendremos de una solicitud especifica.
string bodyText
Nos servirá para almacenar un XML en formato cadena de texto.
Stream responseStream
Nos servirá para almacenar la secuencia de bytes de nuestra respuesta.
Byte[] RecvBytes = new byte[byte.MaxValue];
Una matriz de bytes que tiene el valor maximo de un byte como numero de posiciones
Int32 bytes;
Un entero en el cual almacenaremos los bytes 1 por 1
Ahora necesitamos crear una peticion pasandole el URL a la variable de tipo HttpWebRequest usando el método WebRequest.Create, luego usaremos el método GetResponse en httpResquest para pasarle a la variable httpResponse el resultado.
Asignamos el resultado a la variable tipo Stream para poder recorrela y asignar cada uno de los bytes de esta secuencia a nuestra variable bytes la cual haciendo uso del metodo Enconding sera convertida a una cadena de tipo string que al final sera lo que nuestra funcion getHTTP devuelva.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
try { httpRequest = (HttpWebRequest)WebRequest.Create(szURL); httpResponse = (HttpWebResponse)httpRequest.GetResponse(); responseStream = httpResponse.GetResponseStream(); while (true) { bytes = responseStream.Read(RecvBytes, 0, RecvBytes.Length); if (bytes <= 0) break; bodyText += System.Text.Encoding.UTF8.GetString(RecvBytes, 0, bytes); } } catch (Exception e) { bodyText = "HTTP Error:" + e.Message; } finally { httpRequest = null; httpResponse = null; if (responseStream != null) { responseStream.Dispose(); responseStream = null; } } return bodyText; |
Todo lo anterior sera colocado dentro de un Try-Catch para controlar las diferentes excepciones.
Una vez que tenemos la funcion la cual nos devolvera el texto que nos da como resultado la pagina web al solicitar el valor de una moneda, debemos proceder a leer este texto el cual tiene la estructura de un XML y haciendo uso de sus etiquetas recuperar el valor de la conversión .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
try { string value = getHTTP("http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=USD&ToCurrency=MXN"); XmlDocument xDoc = new XmlDocument(); xDoc.LoadXml(value); XmlNodeList xdolar = xDoc.GetElementsByTagName("double"); var val = ""; foreach (XmlElement nodo in xdolar) { val = decimal.Parse(nodo.InnerText).ToString("N2"); } valorDolar = Convert.ToDouble(val); } catch { valorDolar = 15.3973; } finally { } |
El código anteriormente colocado se encarga de almacenar en una variable llamada value el resultado de darle a nuestra función la URL con los códigos de las monedas.
Posteriormente declaramos una variable de tipo XmlDocument a la cual le cargaremos el contenido de nuestra variable value haciendo uso del método .LoadXml.
Ya que tenemos nuestro texto cargado en una variable XmlDocument, creamos una variable tipo XmlNodeList a la cual usando el método GetElemntsByTagName le pasaremos todos los elementos que tengan como etiqueta la palabra “double”.
Ya con esta lista solo nos queda recorrerla y asignar el valor que se almacena en la propiedad InnerText de cada elemento tipo XmlElement a una variable, en nuestro caso var la cual es convertida a decimal y posteriormente asignada a nuestra variable valorDolar de tipo Double.
Y Listo!!!
Ya con esto obtendríamos el valor listo para usarse en alguna operación o si desea puede almacenarlo en su base de datos.