VB .NET - Consumindo um Web Service JSON - Previsão do Tempo


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:

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 Desktope a seguir 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:

1 - O usuário seleciona uma cidade no combobox cboCidades

2 - Clica no botão de comando btnPrevisaoTempo

3 - O serviço REST é acessado e os dados são obtidos

4 - 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:

  1. PrevisaoTempoCidade(ByVal nome as String) As WeatherInfo - Retorna a previsão do tempo para a cidade selecionada;
  2. 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)

(Disse Jesus) "Se vós estiverdes em mim, e as minhas palavras estiverem em vós, pedireis tudo o que quiserdes, e vos será feito. "
João 15:7

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti