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)










