Client HTTP en Swift : faire des requêtes correctement de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction



Les applications modernes iOS et macOS fonctionnent rarement sans interaction avec des serveurs distants. Qu'il s'agisse de charger des données depuis un fil d'actualités, d'envoyer un formulaire d'inscription ou de synchroniser des fichiers — toutes ces opérations nécessitent une implémentation correcte d'un client HTTP. Dans l'écosystème Swift, le développeur dispose du puissant framework intégré URLSession, qui devient chaque année plus pratique grâce à l'introduction de async/await.



Dans cet article, nous allons voir comment créer correctement des requêtes HTTP en Swift, en commençant par les structures de base et en terminant par les techniques avancées de gestion des erreurs et de sérialisation des données. Vous apprendrez à écrire un code réseau propre, sûr et performant pour vos applications.



Les bases d'URLSession : première requête HTTP



La classe URLSession est le fondement de tout travail réseau en Swift. Elle gère la configuration, la mise en cache, les sessions et l'exécution directe des requêtes. Examinons une requête GET simple pour récupérer des données depuis un serveur.



Création d'une requête GET simple



import Foundation

// 1. Création de l'URLguard let url = URL(string: "https://api.example.com/users") else { print("URL invalide") return}

// 2. Création de la requête (GET par défaut)var request = URLRequest(url: url)request.httpMethod = "GET"request.setValue("application/json", forHTTPHeaderField: "Accept")

// 3. Création de la sessionlet session = URLSession.shared

// 4. Exécution de la requête (ancienne méthode avec closure)let task = session.dataTask(with: request) { data, response, error in if let error = error { print("Erreur de requête : \\(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("Le serveur a retourné une erreur") return } if let data = data, let jsonString = String(data: data, encoding: .utf8) { print("Données reçues : \\(jsonString)") }}task.resume() // Important ! Lancer la tâche


Points clés : vérifiez toujours le statut de la réponse (200...299), n'oubliez pas d'appeler resume(), et gérez les erreurs possibles. Dans les projets réels, ce code est généralement placé dans une couche de service séparée.



Approche moderne : async/await



Depuis Swift 5.5, il est possible d'utiliser async/await, ce qui rend le code beaucoup plus lisible et évite la « pyramide des closures ».



func fetchUsers() async throws -> Data {    guard let url = URL(string: "https://api.example.com/users") else {        throw URLError(.badURL)    }        var request = URLRequest(url: url)    request.httpMethod = "GET"    request.setValue("application/json", forHTTPHeaderField: "Accept")        let (data, response) = try await URLSession.shared.data(for: request)        guard let httpResponse = response as? HTTPURLResponse,          (200...299).contains(httpResponse.statusCode) else {        throw URLError(.badServerResponse)    }        return data}


Ce code peut être appelé depuis n'importe quelle fonction ou tâche asynchrone, ce qui simplifie considérablement la logique.



Travailler avec JSON : Codable et modèles de données



Il est rare que les données arrivent sous forme « brute ». Le plus souvent, nous avons affaire à du JSON. Swift propose une solution élégante — le protocole Codable (qui combine Encodable et Decodable).



Création d'un modèle et décodage



// 1. Définition de la structure de donnéesstruct User: Codable {    let id: Int    let name: String    let email: String}

// 2. Fonction asynchrone pour obtenir un tableau d'utilisateursfunc fetchUsers() async throws -> [User] { let data = try await fetchUsersData() // de l'exemple précédent let decoder = JSONDecoder() return try decoder.decode

Blogs

Book Recommendations