.NET

22 set, 2017

Consumo de API’s em .NET Core: utilizando API’s REST da NASA

Publicidade

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:

Novidades do ASP.NET Core 2.0

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:

Conteúdos gratuitos sobre ASP.NET Core, .NET Core e C# 7.0