Este artigo tem como objetivo apresentar o projeto NASA Open API’s, um conjunto de API’s REST disponibilizadas gratuitamente pela Agência Espacial Norte-Americana.
Além de imagens com informações astronômicas diárias, a NASA também conta com funcionalidades como, a consulta a dados de asteroides em rota de aproximação da Terra e fotos de observações em Marte.
As próximas seções trazem um exemplo de utilização de uma dessas API’s, considerando para isto, a implementação de uma aplicação baseada no ASP.NET Core 2.0.
Caso queira mais referências sobre o consumo de API’s REST com .NET Core, consulte o artigo a seguir, no qual abordei este tipo de prática a partir do uso da Marvel Comics API:
Consumo de APIs em .NET Core: utilizando a Marvel Comics API
E como um dos assuntos deste artigo são API’s REST, deixo aqui um convite. No dia 28/09 (quinta-feira), teremos mais uma apresentação online no Canal .NET a partir de 21h30 – horário de Brasília.
Desta vez contaremos com a presença de Lucas Massena, apresentando os prós e contras das Arquiteturas de Micro-serviços, além de técnicas e dicas de como construir – ou não – uma aplicação com Microservices.
Para efetuar sua inscrição, acesse a página do evento no Facebook ou então o Meetup. A transmissão será via YouTube, em um link a ser divulgado futuramente.
NASA Open APIs: obtendo uma chave de acesso
Para conhecer mais sobre os recursos que a NASA disponibiliza via APIs REST, acesse o link a seguir: https://api.nasa.gov/index.html
Uma chave deverá ser gerada para consumo das informações existentes. Na próxima imagem está o formulário para requisição deste item de configuração:
Observação importante: há um limite máximo de 1000 requisições por hora ao se utilizar uma chave de acesso.
Implementando a aplicação para testes
Será criado um projeto do tipo ASP.NET Core Web Application chamado SiteDadosNASA:
Selecionar para isto o template Web Application, além das opções .NET Core e ASP.NET Core 2.0:
O template escolhido (Web Application), faz uso de Razor Pages, um novo tipo de estrutura baseado apenas em Views/Actions e que dispensa a implementação de Controllers. Caso deseje saber mais a respeito das novidades do ASP.NET Core 2.0, acesse este artigo:
Como próximo passo, vamos implementar a classe ImagemNASA, que conterá dados como o título, a descrição, o formato (figura ou vídeo) e a URL de uma imagem disponibilizada pela NASA:
using System; namespace SiteDadosNASA { public class ImagemNASA { public DateTime Data { get; set; } public string Titulo { get; set; } public string Descricao { get; set; } public string Url { get; set; } public string MediaType { get; set; } } }
A listagem a seguir traz o código que será executado ao acessar a View Index.cshtml (método OnGet da classe IndexModel):
- A chave e a URL para acesso às APIs da NASA estão declaradas no arquivo appSettings.json, sendo obtidas por meio da referência do tipo IConfiguration (namespace Microsoft.Extensions.Configuration)
- Para este exemplo específico, será utilizada a API chamada APOD (Astronomy Picture of the Day), a qual retorna diariamente a URL e dados de uma imagem/vídeo em destaque. Esta funcionalidade permite ainda pesquisas retroativas, com o site de testes aqui descritos, considerando os últimos sete dias (a exibição de um dia acontecerá de forma randômica)
- Nota-se ainda o uso da classe HttpClient (namespace System.Net.Http), com a mesma sendo empregada na comunicação com a API REST da NASA
- Para o envio de uma requisição, serão informados o valor da chave obtida junto à NASA (parâmetro api_key), além do dia-base para pesquisa (parâmetro date)
using System; using System.Net.Http; using System.Net.Http.Headers; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; namespace SiteDadosNASA.Pages { public class IndexModel : PageModel { public string dataImagem { get; set; } public void OnGet( [FromServices]IConfiguration config) { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); string baseURL = config.GetSection("NASA_OpenAPIs:BaseURL").Value; string key = config.GetSection("NASA_OpenAPIs:Key").Value; DateTime dataBase = DateTime.Now.Date.AddDays( new Random().Next(0, 7) * -1); HttpResponseMessage response = client.GetAsync( baseURL + "apod?" + quot;api_key={key}&" + quot;date={dataBase.ToString("yyyy-MM-dd")}").Result; response.EnsureSuccessStatusCode(); string conteudo = response.Content.ReadAsStringAsync().Result; dynamic resultado = JsonConvert.DeserializeObject(conteudo); ImagemNASA imagem = new ImagemNASA(); imagem.Data = dataBase; imagem.Titulo = resultado.title; imagem.Descricao = resultado.explanation; imagem.Url = resultado.url; imagem.MediaType = resultado.media_type; TempData["ImagemNASA"] = imagem; } } } }
Já na próxima listagem está o código para a exibição de informações na View Index.cshtml (que inclui uma checagem, a fim de determinar se estará sendo exibida uma imagem ou vídeo):
@page @model IndexModel @{ ViewData["Title"] = "Home page"; ImagemNASA imagem = (ImagemNASA)TempData["ImagemNASA"]; } <h2 style="text-align:center;">Acessando as APIs REST da NASA - Imagem do Dia @imagem.Data.ToString("dd/MM/yyyy")</h2> <h3 style="text-align:center;">@imagem.Titulo</h3> <div style="text-align: center;"> @if (imagem.MediaType == "image") { <img src="@imagem.Url" style="height: 60%; width: 60%" /> } else { <iframe id="apod_vid_id" type="text/html" src="@imagem.Url" width="640" height="385" frameborder="0"> </iframe> } </div> <p style="margin-top: 15px; margin-left: 20%; width: 60%;"> @imagem.Descricao </p>
As fontes do projeto implementados nesta seção podem ser encontrados no GitHub: https://github.com/renatogroffe/ASPNETCore2_NASA-Open-APIs
Testes
As imagens a seguir mostram a aplicação SiteDadosNASA em execução. É possível observar 3 destas imagens disponibilizadas pela NASA, além de um quarto exemplo com um vídeo:
E para concluir, gostaria de mais referências gratuitas sobre ASP.NET Core e .NET Core? Acesse então o artigo a seguir, em que estão listados todos os artigos e vídeos que produzi sobre estas tecnologias: