Andrew Castro
Aug 12 · 6 min read

Introdução

Há algum tempo, o JSON se tornou o formato mais usado para transferir dados. É muito comum o desenvolvedor trabalhar com dados JSON, por isso este artigo tem a finalidade de mostrar como usar o Alamofire para gerenciar a camada de serviço e o Codable para decodificar o response.

O JSON (JavaScript Object Notation), basicamente, é um modelo de formato em texto para armazenamento e troca de informações entre sistemas de uma forma bem compacta.

O Codable foi adicionado ao Swift 4 como uma forma de permitir que os objetos se convertam em uma apresentação externa. Codable é um protocolo que em si é um typealias de Decodable e Encodable.

Ao usá-lo, pode-se modelar o JSONObject em Struct ou Classes. Não é preciso escrever o construtor, tudo é entregue pelo Codable. O que deve ser feito é estender o modelo para estar em conformidade com o protocolo.

Já o Alamofire é uma biblioteca HTTP Networking baseada em Swift para iOS e MacOS. Fornece métodos de request/response, parâmetros JSON e serialização de response, autenticação e muitos outros recursos.

A melhor coisa do Alamofire é que ele foi escrito 100% em Swift. Sua documentação é bem detalhada e não deixa nenhuma dúvida quanto à implementação de qualquer tipo de recurso que você queira utilizar e de que possa oferecer.

Camada de serviço — Alamofire

O JSON será obtido através de uma url, que estará mockado. “Mockar” significa que haverá uma simulação de um objeto real que pode ser manipulado no dia a dia. Assim, pode-se ter o controle do objeto para ajustar algum comportamento no aplicativo, realizar testes, etc.

Pode-se usar o mocky.io justamente para para gerar um objeto customizado(mock) podendo alterar o status code da resposta, o content type e body.

https://www.mocky.io/v2/5d3ee2a52f00000e006d0058

Abaixo, verifica-se a classe de serviço para obter o JSON. Nela será utilizado o Alamofire.

final class AppService {    private var alamofireManager: Alamofire.SessionManager
private var url: String = “”
init(_ url: String, timeout: TimeInterval = 15) {
self.url = url
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = timeout
configuration.timeoutIntervalForResource = timeout
alamofireManager = Alamofire.SessionManager(configuration:configuration)
}
func getFromServer(completionHandler: @escaping(_ articleContent: ArticleContent?, _ error: String?) -> Void) {
alamofireManager.request(self.url).validate(statusCode: 200..<300).validate(contentType: [“application/json”]).responseJSON { response in
switch response.result {
case .success:
guard let jsonData = response.data, let value = response.value, let articleContent = try? JSONDecoder().decode(ArticleContent.self, from: jsonData) else {
fallthrough
}
print(“Título do artigo: \(articleContent.title ?? “”), linguagem utilizada: \(articleContent.language ?? “”)”)
print(value)
completionHandler(articleContent, nil)
case .failure:
completionHandler(nil, “Erro! Tente novamente”)
}
}
}
}

Essa classe de serviço contém alguns detalhes bem interessantes. O primeiro deles é o session manager, que será responsável pela criação e gerenciamento de objetos request.

O timeoutIntervalForRequest determina o intervalo de tempo limite da solicitação para todas as tarefas nas sessões com base nessa configuração. O intervalo de tempo limite da solicitação controla por quanto tempo (em segundos) uma tarefa deve aguardar a chegada de dados adicionais antes de desistir. O tempo default é 60 segundos.

O timeoutIntervalForResource determina o intervalo de tempo limite do recurso para todas as tarefas dentro de sessões com base nessa configuração. O intervalo de tempo limite do recurso controla por quanto tempo (em segundos) aguardar que um recurso inteiro seja transferido antes de desistir. O tempo default é 7 dias.

Já o .request cria um DataRequest para recuperar o conteúdo da URL especificada. Caso tenha algum parâmetro ou header especificado, também irá recuperar.

O .validate valida (really?!) que o response tem um código de status na sequência especificada.

Ao usar o JSONDecoder().decode, iremos retornar um valor do tipo que é especificado, decodificado de um objeto JSON. Para isso, a model precisa estar em conformidade com o protocolo Codable. Dessa forma, a estrutura da model irá ficar conforme descrita abaixo.


Info.plist

Caso o projeto a ser desenvolvido use um protocolo de comunicação não seguro (sem ‘https’), acesse o info.plist localizado na raiz do projeto e adicione as seguintes configurações:

Basta clicar no botão + localizado ao lado da linha 'Information Property List', e adicionar as Property List Key 'App Transport Security Settings' e 'Allow Arbitrary Loads'.

O App Transport Security Setting é descrição das alterações feitas na segurança padrão para conexões HTTP. E o Allow Arbitrary Loads indica se as restrições de Segurança de Transporte do Aplicativo estão desabilitadas para todas as conexões de rede através do valor booleano, YES (true) e NO (false).


Camada Model — Codable

struct ArticleContent: Codable {
var title: String?
var language: String?
var platform: String?
var technology: [Technology]?
}
struct Technology: Codable {
var name: String?
var type: String?
var documentation: String?
}

Vale ressaltar que nem sempre o nome das propriedades do JSON virão da maneira desejada (nesse caso, a variável declarada pode ter um nome diferente da propriedade do objeto). A maioria dos projetos costuma ter padrões em suas classes modelos, usando os nomes das variáveis em Inglês. Mas, o JSON pode ter propriedades com nome em Português ou pode vir com algum caracter especial. Nesse último caso, basta utilizar o Coding Key. Através deste, será possível alterar o nome da key para criar um mapeamento entre nomes das variáveis da classe e os nomes das propriedades do JSON.

struct ArticleContent: Codable {
var title: String?
var language: String?
var platform: String?
var technology: [Technology]?

enum CodingKeys: String, CodingKey {
case title = “titulo”
case language = “linguagem”
case platform = “plataforma”
case technology = “tecnologia”
}
}

Como foi falado, não é preciso de construtores já que o Codable o entrega. Quando a model estiver em conformidade com o protocolo, basta verificar se o response.data não está nil e fazer o decode. Depois, será exibido a propriedade que se refere ao título do artigo, linguagem utilizada e a estrutura completa do JSON. Buildando o projeto será obtido esses dados:

Pode-se ver que o título do artigo e a linguagem utilizada tem os mesmo valores do JSON e a sua estrutura é a mesma!

Lembrando que é possível usar uma closure com o @escaping, como foi feito na função getFromServer. Nesse caso, irá conter um parâmetro do tipo da model(ArticleContent) para ser tratado em uma camada especifica da arquitetura que estiver sendo usada no projeto e um do tipo String para ilustrar um possível erro.

Conclusão

Foi possível ver uma maneira bem comum e fácil de se utilizar o Alamofire com Codable. Muitos projetos necessitam fazer esse tipo de operação, e entender o que foi abordado é essencial para o domínio do que foi proposto no artigo.

Ao utilizar Codable, serão poupadas linhas de código na model, já que não se utilizará frameworks que fazem o mesmo que o Codable faz.


Meu nome é Andrew Castro, Desenvolvedor iOS que busca sempre aprender e compartilhar conhecimento com todos. Sou da filosofia que você deve fazer tudo por paixão e diversão.

Caso tenha alguma dúvida, me chame nos comentários ou me encontre aqui. Abraço!


A Mobicare combina os Melhores Talentos, Tecnologias de Ponta, Práticas Agile e DevOps com Capacidades Operacionais avançadas para ajudar Operadoras Telecom a gerar novas receitas e a melhorar a experiência dos seus próprios clientes.

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito!

Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

Andrew Castro

Written by

iOS Developer for fun

mobicareofficial

Se você gosta de inovar, trabalhar com tecnologia de ponta e está sempre buscando conhecimento, somos um match perfeito! Vem trabalhar com a gente 😉 bit.ly/mobicarreiras

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade