No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Comunicación de red HTTP con TheMovieDB

24/28
Recursos

La implementación de una API bajo la filosofía de Clean Architecture nos permite mantener una clara separación de responsabilidades y facilitar la escalabilidad del proyecto. Empezamos por crear nuestros modelos de datos, que son la base de todas las operaciones. Estos modelos se encuentran en la capa más interna de nuestra arquitectura, seguida por la capa de dominio y, finalmente, la capa de presentación.

¿Cómo crear un endpoint?

Para conectarnos a una API externa, debemos comenzar con la definición de nuestros endpoints. Esto implica crear un archivo en la carpeta network, que servirá como referencia para las rutas que necesitamos apuntar. Aquí definiremos dos enums principales, HTTPMethod y Endpoint:

enum HTTPMethod: String {
    case get = "GET"
    case post = "POST"
}

enum Endpoint {
    case popularShows
    case tvShowDetails(Int)

    var url: URL {
        // Construcción de la URL usando baseUrl y API Key
    }
}

¿Cómo construir las URLs?

La construcción de URLs es crucial para que nuestra API funcione correctamente. Necesitamos definir una URL base a partir de la cual construiremos solicitudes específicas. El ejemplo de la base URL para The MovieDB podría ser:

let baseUrl = "https://api.themoviedb.org/3/"

Luego, añadimos el endpoint correspondiente, como tv para programas de televisión, y agregamos parámetros como la API Key y el idioma:

var urlComponents = URLComponents(string: baseUrl + "tv/popular")!
urlComponents.queryItems = [
    URLQueryItem(name: "api_key", value: "YOUR_API_KEY"),
    URLQueryItem(name: "language", value: "en-US"),
    URLQueryItem(name: "page", value: "1")
]

¿Cómo implementar un cliente API?

La clase APIClient será responsable de manejar las solicitudes HTTP a la API. Este cliente preparará las solicitudes y decodificará las respuestas JSON:

final class APIClient {
    func request(_ endpoint: Endpoint) async throws -> T {
        let urlRequest = URLRequest(url: endpoint.url)
        urlRequest.httpMethod = HTTPMethod.get.rawValue

        let (data, _) = try await URLSession.shared.data(for: urlRequest)
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    }
}

¿Cómo manejar los repositorios?

En una arquitectura limpia, el repositorio actúa como un intermediario entre las capas de datos y de dominio. Aquí definimos un protocolo y su implementación:

protocol TVShowRepository {
    func fetchPopularTVShows() async throws -> [TVShow]
    func fetchTVShowDetails(id: Int) async throws -> TVShowDetails
}

final class TVShowRepositoryImplement: TVShowRepository {
    private let apiClient: APIClient

    init(apiClient: APIClient) {
        self.apiClient = apiClient
    }

    func fetchPopularTVShows() async throws -> [TVShow] {
        let response: PopularShowsResponse = try await apiClient.request(.popularShows)
        return response.results
    }

    func fetchTVShowDetails(id: Int) async throws -> TVShowDetails {
        return try await apiClient.request(.tvShowDetails(id))
    }
}

¿Qué beneficios ofrece Clean Architecture?

Implementar Clean Architecture permite una mayor flexibilidad y mantenibilidad del código. Cada capa tiene responsabilidades claramente definidas, lo que facilita la sustitución o actualización de una parte del sistema sin afectar a las demás. Además, fomenta la reutilización del código y mejora la escalabilidad del proyecto.

Con cada paso cuidadosamente planeado e implementado, tu aplicación estará lista para gestionar eficazmente la comunicación con APIs externas, mantener un código limpio y ofrecer una gran experiencia de usuario.

Aportes 0

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?