Alura > Cursos de Mobile > Cursos de iOS > Conteúdos de iOS > Primeiras aulas do curso iOS com view code: requisições para APIs REST

iOS com view code: requisições para APIs REST

Requisições HTTP - Apresentação

Boas-vindas! Meu nome é Giovanna Moeller e eu sou instrutora aqui na Alura. Quero te dar as boas-vindas a este curso de iOS com ViewCode focado em requisições HTTP.

Audiodescrição: Giovanna Moeller se identifica como uma mulher branca, de cabelos loiros, lisos e longos. Seu rosto é oval. Tem olhos escuros, nariz fino e lábios grossos. Usa uma camiseta azul-escuro com o logotipo da Alura. Ao fundo, uma parede lisa iluminada em tons de rosa com uma prateleira de livros e um painel LED luminoso com a palavra "Alura" à esquerda, e com um vaso de plantas à direita.

Durante este curso, o nosso projeto continua sendo o Cinetopia, um projeto em que conseguimos visualizar uma lista de filmes populares. Inclusive, quando tocamos em um elemento dessa lista, conseguimos ver uma tela de detalhes com mais informações, como por exemplo, classificação dos usuários e também uma breve sinopse.

E um ponto extremamente importante é que essa lista é totalmente dinâmica. Estamos consumindo de um serviço externo, ou seja, de uma API externa.

Este curso é focado em como podemos fazer requisições HTTP para, então, atualizarmos o nosso aplicativo com dados dinâmicos.

É muito importante aprender sobre requisições HTTP, porque no nosso dia a dia, como pessoa desenvolvedora mobile, lidamos com essa comunicação de serviços externos a todo tempo.

Pré-requisitos

Como pré-requisitos para este curso, você precisa entender o básico de ViewCode, a construção de layout com ViewCode, e também como construir um layout com tabelas via ViewCode.

Mas não se preocupe, porque temos todos esses conteúdos aqui na plataforma Alura.

Espero que você tenha se animado, porque eu estou muito animada para introduzir esse conceito para vocês. Espero você no próximo vídeo!

Requisições HTTP - Entendendo uma requisição HTTP

Vamos começar entendendo como funciona uma requisição HTTP, porque, até então, no nosso aplicativo, estamos exibindo apenas três filmes que criamos com um array estático no nosso projeto.

Agora, vamos consumir essa lista de filmes de uma API para atualizarmos no nosso aplicativo. Para isso, precisamos entender como as requisições HTTP funcionam.

O que é uma API RESTful?

Quando falo de uma API externa, um serviço externo, um servidor externo, o que estou querendo dizer? É uma interface que permite a troca de informações entre duas aplicações.

Então, eu tenho o meu aplicativo e a minha API RESTful, que contém essa lista de filmes, e vou trocar informações, consumir essa lista de filmes no meu aplicativo. Ela permite que o aplicativo se comunique pela web. O que quero dizer com "pela web"? Eu quero dizer pela internet, porque a nossa API RESTful terá uma URL, e eu preciso acessar essa URL para retornar os dados que ela me traz no meu aplicativo. Então, eles se comunicam pela web.

Mas como uma aplicação se comunica com uma API RESTful?

É aí que entram as requisições HTTP. O HTTP é um protocolo da web, um conjunto de regras que define como as aplicações devem se comunicar na internet.

O cliente envia requisições para o servidor e o servidor envia as respostas.

Imagine que você está na internet e quer acessar o site do Google. O cliente, nesse caso, é o seu navegador, que enviará requisições para o servidor dizendo: "Eu quero acessar o site google.com.br". E então, o servidor enviará as respostas, ou seja, o site em si, com o HTML, o CSS, todas essas informações.

A mesma coisa está acontecendo entre nosso aplicativo e nossa API RESTful, que exibe a lista de filmes. O cliente no aplicativo está fazendo requisições para o servidor, que é a API RESTful, e ele está enviando respostas, ou seja, a lista de filmes, como pedimos.

Como esses dados são trafegados?

Por exemplo, estou falando que retorna uma lista de filmes, mas como essa lista de filmes é retornada? Qual é o tipo de dado? É aí que entra o JSON (JavaScript Object Notation).

JSON é um formato textual de dados composto por uma chave e um valor. Quando falamos sobre comunicação com a API, muito provavelmente vamos receber esses dados em formato JSON. Trouxe um exemplo de como esse JSON funciona: temos chaves e valores, com a chave sendo "title" e o valor sendo "Harry Potter e as Relíquias da Morte, Parte 2". Esse é um objeto JSON que representa um único filme:

{
    "id": 5,
    "title": "Harry Potter e as Relíquias da Morte: Parte 2",
    "rate": 8.1,
    "release_date": "15/07/2011"
}

Próximo passo

Agora que já entendemos como uma requisição HTTP funciona, vamos analisar um pouco mais sobre como essa lista de filmes é retornada da nossa API.

Nesse caso, para este curso, minha API está sendo executada em localhost, ou seja, na minha própria máquina. Por esse motivo, a URL da minha API é composta de localhost:3000/movies. Esse /movies é o meu recurso, o que significa que, ao acessar esta URL, ela me retornará uma lista de filmes em formato JSON, com cerca de 20 filmes, mais ou menos. Temos essa lista de filmes sendo retornada dessa API.

Não se preocupe se você não conseguir executar a API na sua máquina, porque na atividade "Preparando Ambiente" também dou uma opção para você acessar essa API e conseguir retornar essa lista de filmes, para que nosso aplicativo possa consumir dessa API, pegar essa lista de filmes e, então, exibir na nossa tabela.

Agora que já entendemos todo esse funcionamento, vamos partir para o código Swift para conseguirmos fazer essa requisição.

Criando a camada de requisição - Criando o arquivo de requisição

Vamos começar criando um novo arquivo que conterá todo o código responsável por uma requisição HTTP.

Criando arquivo de requisição HTTP

Retornando ao projeto, vamos criar uma nova pasta. Ao clicarmos logo acima de Cinetopia do lado esquerdo e selecionarmos a opção "New Group" com o botão direito do mouse, daremos a ela o nome de Services. Dentro desse diretório, estabeleceremos um novo arquivo do tipo Swift File com o botão direito, escolhendo a opção "New File". Ao seguir adiante, clicamos em "Next" no canto inferior direito da janela e o nomearemos como MovieService (Serviço Relacionado ao Filme).

Dentro desse arquivo, começaremos a criar uma struct que conterá todos os métodos necessários para realizar as requisições. Assim, teremos a struct MovieService. Lembrando de que, por convenção, é recomendável iniciar o nome de uma struct com letra maiúscula.

Dentro dessa struct, desenvolveremos, neste momento, um único método: func getMovies (Pegar Filmes). Sendo assim, teremos getMovies() {}. Não faremos nenhum retorno por enquanto, apenas definiremos este método.

Arquivo MovieService.swift no repositório do GitHub

import Foundation

struct MovieService {
    func getMovies() {
       
        }

Agora, vamos retornar à nossa MoviesViewController e criaremos uma instância da struct MovieService. Assim, subiremos em nosso código, imediatamente após a definição da variável isSearchActive, e introduziremos uma nova variável: private let movieService: MovieService = MovieService().

Embora seja possível ocultar o tipo, manteremos a padronização, pois nas outras variáveis estamos definindo o tipo dessa forma.

MoviesViewController.swift

// código omitido

private var movieService: MovieService = MovieService()

// código omitido

Neste ponto, já estabelecemos a instância de MovieService em nossa MoviesViewController, o que nos permite invocar o método getMovies. Agora, descemos em nosso código e, logo acima da função addSubViews, introduziremos outra função.

No próximo trecho de código, definimos a função private func fetchMovies() {}. Embora pudéssemos optar por chamá-la de getMovies, decidimos evitar possíveis confusões com a função que criamos no MovieService. Vale ressaltar que a palavra fetch significa buscar. Dentro desta função, incluiremos um comentário explicativo para destacar seu funcionamento.

Digitamos então "// Vamos chamar a função getMovies do movie service quando ela estiver pronta". Isso porque apenas definimos a função e não implementamos ainda. Assim, quando a função fetchMovies estiver pronta, faremos a chamada para getMovies no MovieService.

MoviesViewController.swift

// código omitido

private func fetchMovies() {
// Vamos chamar a funcao getMovies do movie service quando ela estiver pronta
}
        
// código omitido

Agora, nos resta invocar fetchMovies no método viewDidLoad. A razão para isso é simples: desejamos que a lista de filmes seja exibida assim que a tela for carregada. Portanto, imediatamente após a execução de setupConstraints dentro do viewDidLoad, acionaremos a função fetchMovies.

MoviesViewController.swift

// código omitido

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .background
setupNavigationBar()
addSubviews()
setupConstraints()
fetchMovies()
}

// código omitido

Aqui está delineado todo o fluxo da maneira como lidaremos com a lista de filmes proveniente da nossa API.

Até mais!

Sobre o curso iOS com view code: requisições para APIs REST

O curso iOS com view code: requisições para APIs REST possui 89 minutos de vídeos, em um total de 56 atividades. Gostou? Conheça nossos outros cursos de iOS em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda iOS acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas