quinta-feira, 26 de março de 2015

Consumir um serviço web com C#

Neste artigo vamos aprender como consumir um serviço web com uma aplicação desktop criada em C#.

Um serviço web (web service) é uma API disponível através da Web que pode ser utilizada desde que se respeite as condições de uso. Em alguns casos os web services são gratuítos e não requerem nenhum registo ou credênciais, no entanto, existem outros serviços que depende de um registo e até de um pagamento.

Para demonstrar o conceito vamos utilizar um serviço oferecido pelo Banco Central Europeu disponível no seguinte link http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml.
Este serviço devolve as cotações diárias de moedas em função do valor do euro. Os dados são codificados em formato XML.

O pedido dos dados não pode acontecer na thread principal do programa uma vez que isso provocaria a paragem da interface. Assim é necessário recorrer a um pedido assincrono numa thread separada da thread responsável pela atualização a interface gráfica (GUI).

O código que vai permitir consumir os dados é o seguinte:

async void downloadXML()
        {
            string url = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
            WebRequest pedido = WebRequest.Create(url);
            WebResponse resposta = await pedido.GetResponseAsync();
            XDocument documento = XDocument.Load(resposta.GetResponseStream());
            textBox1.Text = documento.ToString();

            //preencher a listview
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(documento.ToString());
            XmlNodeList lista = xml.GetElementsByTagName("Cube");
            foreach (XmlNode no in lista)
            {
                if (no.Attributes.Count > 1)
                {
                    ListViewItem novo = new ListViewItem(no.Attributes[0].InnerXml);
                    novo.SubItems.Add(no.Attributes[1].InnerXml);
                    listView1.Items.Add(novo);
                }
            }
        }


Trata-se de uma função assincrona que é chamada a partir de um clique num botão.
Como se pode verificar na linha de definição da função é utilizada a palavra reservada async.
Esta foi introduzida no Visual Studio 2012 e permite simplificar o trabalho de criar uma função assincrona deixando a parte mais dificil para o compilador (Ler mais sobre o assunto).
A execução corre normalmente até encontrar a linha com o termo await onde o controlo da execução é devolvido para a linha que chamou a função assincrona, não bloqueando a interface, enquanto espera que o processamento dessa linha termine para continuar até ao final da função.

O resto da função permite manipular os dados recebidos em formato XML.

Projeto

Sem comentários:

Enviar um comentário