Neste artigo, vou mostrar como consumir um serviço REST para previsão do tempo usando a linguagem VB .NET.
Eu já apresentei os conceitos sobre como acessar web services e/ou serviços API REST nestes artigos:
- .NET – HttpWebRequest x WebClient x HttpClient – Macoratti
- VB .NET – Obtendo informações de uma web page – Macoratti
Hoje vou focar na utilização prática de como acessar um serviço web e obter resultados em uma aplicação Windows Forms usando a linguagem VB .NET.
Como exemplo, eu vou acessar o serviço da OpenWeatherMap API service que permite obter a previsão de tempo (e mapas) para uma determinada localidade e exibir os dados retornados.
Para pode usar o serviço grátis, você tem que se registrar e obter uma API Key (AppId) neste link: https://home.openweathermap.org/users/sign_in
A documentação de como usar a API para previsão do tempo pode ser consultada neste link: https://openweathermap.org/current#current_JSON
Vamos ao trabalho…
Recursos usados:
Nota: Baixe e use a versão Community 2017 do VS; ela é grátis e é equivalente a versão Professional.
Criando o projeto no Visual Studio 2017 Community
Abra o Visual Studio Community 2017 e clique em New Project. Selecione Visual Basic, o template Windows Classic Desktop e, a seguir, o Windows Forms App(.NET Framework).
Informe o nome Vbn_WeatherApi e clique no botão OK:
Criando a interface com o usuário
A seguir, defina no formulário Form1.vb o leiaute, conforme mostrado na figura abaixo:
O fluxo de processamento é o seguinte:
- O usuário seleciona uma cidade no combobox cboCidades;
- Clica no botão de comando btnPrevisaoTempo;
- O serviço REST é acessado e os dados são obtidos;
- Os dados são formatados e exibidos no formulário.
- Criando as classes de domínio para obter os dados desserializados
Precisamos criar as classes para obter os dados que serão obtidos do serviço REST e desserializados no formato JSON.
Essa tarefa fica bem simples se usarmos o recurso disponíbilizado http://json2csharp.com/. Aqui, podemos gerar as classes C# a partir do JSON.
Então, basta enviar uma requisição, obter o JSON retornar e, a seguir, copiar e colar este JSON no site indicado para gerar as classes C#.
Basta copiar as classes geradas e converter para o código VB .NET. (Use este link para converter: http://converter.telerik.com/)
Para o nosso exemplo, as classes geradas foram:
Public Class WeatherInfo Public Property city As City Public Property list As List(Of List) End Class Public Class City Public Property name As String Public Property country As String End Class Public Class Temp Public Property day As Double Public Property min As Double Public Property max As Double Public Property night As Double End Class Public Class Weather Public Property description As String Public Property icon As String End Class Public Class List Public Property temp As Temp Public Property humidity As Integer Public Property weather As List(Of Weather) End Class
Criando a classe para acessar o serviço e obter as informações
Para poder definir o código da classe que acessa o serviço, temos que incluir uma referência a API Newtonsoft.Json no projeto via Nuget:
Vamos criar uma classe chamada PrevisaoTempo.vb no projeto e definir dois métodos:
- PrevisaoTempoCidade(ByVal nome as String) As WeatherInfo – Retorna a previsão do tempo para a cidade selecionada;
- PrevisaoTempoCoordenadas(latitude as Double, longitude As Double, quantidade As Integer) As WeatherInfo – retorna a previsão do tempo com base na latitude e longitude e define para quantas cidades na região a previsão vai retornar.
Obs: Para usar o segundo método, você precisa incluir uma referência a System.RunTime.Serialization no seu projeto.
Nota: Eu vou implementar somente o primeiro método na interface, deixando o segundo como um exercício para você fazer.
Imports System.IO Imports System.Net Imports System.Runtime.Serialization.Json Imports System.Text Imports Newtonsoft.Json Public Class PrevisaoTempo Shared appId As String = "__o _numero_da_sua_API_KEY" Shared baseUrl As String = "http://api.openweathermap.org/data/2.5/find/city?lat={0}&lon={1}&cnt={2}" Public Shared Function PrevisaoTempoCidade(ByVal nome As String) As WeatherInfo Dim client = New WebClient() client.Headers.Add("User-Agent", "Nobody") Dim url As String = String.Format("http://api.openweathermap.org/data/2.5/forecast/daily?q={0}&units=metric&cnt=1&APPID={1}", nome.Trim(), appId) Try Dim response = client.DownloadString(New Uri(url)) Dim previsao As WeatherInfo = JsonConvert.DeserializeObject(Of WeatherInfo)(response) Return previsao Catch ex As Exception Throw ex End Try End Function Public Shared Function PrevisaoTempoCoordenadas(latitude As Double, longitude As Double, quantidade As Integer) As WeatherInfo Dim url = String.Format(baseUrl, latitude, longitude, quantidade) & "APPID=" & appId Try ' Chamada sincrona Dim syncClient = New WebClient() Dim content = syncClient.DownloadString(url) ' Cria o serializados Json e trata a resposta Dim serializer As New DataContractJsonSerializer(GetType(WeatherInfo)) Using ms = New MemoryStream(Encoding.Unicode.GetBytes(content)) ' deserializa o objeto JSON usando o tipo de dados Dim weatherData = DirectCast(serializer.ReadObject(ms), WeatherInfo) Return weatherData End Using Catch ex As Exception Throw ex End Try End Function End Class
Executando o projeto
A seguir, temos o código do formulário e do botão de comando – btnPrevisaoTempo -, que irá processar o resultado e exibir no formulário:
Public Class Form1 Private Sub btnPrevisaoTempo_Click(sender As Object, e As EventArgs) Handles btnPrevisaoTempo.Click Try Dim weatherInfo As WeatherInfo = PrevisaoTempo.PrevisaoTempoCidade(cboCidades.Text) lblCidade.Text = weatherInfo.city.name + "," + weatherInfo.city.country picImgPais.Load(String.Format("http://openweathermap.org/images/flags/{0}.png", weatherInfo.city.country.ToLower())) lblDescricao.Text = weatherInfo.list(0).weather(0).description picImagem.Load(String.Format("http://openweathermap.org/img/w/{0}.png", weatherInfo.list(0).weather(0).icon)) lblTemperaturaMinima.Text = String.Format("{0}°С", Math.Round(weatherInfo.list(0).temp.min, 1)) lblTemperaturaMaxima.Text = String.Format("{0}°С", Math.Round(weatherInfo.list(0).temp.max, 1)) lblTemperaturaDia.Text = String.Format("{0}°С", Math.Round(weatherInfo.list(0).temp.day, 1)) lblTemperaturaNoite.Text = String.Format("{0}°С", Math.Round(weatherInfo.list(0).temp.night, 1)) lblHumidade.Text = weatherInfo.list(0).humidity.ToString() Catch ex As Exception MessageBox.Show(" Erro: " & ex.Message) End Try End Sub End Class
Executando o projeto e selecionando uma cidade, iremos obter o resultado a seguir:
Pegue o projeto aqui: Vbn_WeatherAPI.zip (sem as referências)