Requêtes HTTP en Swift en 2025 : du débutant au PRO en 20 minutes

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 : Pourquoi les développeurs Swift cherchent-ils encore les requêtes HTTP sur Google ?



Si vous avez déjà écrit une application en Swift qui communique avec un serveur, vous avez forcément rencontré cette question. Cela semble simple, non ? Envoyer une requête, recevoir une réponse. Mais en pratique, un développeur sur deux (même expérimenté) ouvre Stack Overflow et cherche : "How to make HTTP request in Swift?". Et c'est normal.



Pourquoi ? Parce que l'écosystème Swift change. Hier encore, tout le monde écrivait des closures et des delegates. Aujourd'hui — async/await. Et demain, peut-être autre chose. En 2025, les approches des requêtes réseau se sont stabilisées, mais le diable se cache, comme toujours, dans les détails : gestion des threads, traitement des erreurs, annulation des requêtes, tests.



Dans cet article, nous allons voir les vraies meilleures pratiques pour effectuer des requêtes HTTP en Swift — de l'utilisation de base de URLSession aux techniques avancées avec async/await et les bibliothèques. Vous apprendrez à écrire un code réseau propre, sûr et performant. C'est parti !



1. URLSession : Les fondamentaux que tout le monde doit connaître



Commençons par l'essentiel. La bibliothèque standard de Swift (Foundation) contient tout ce qu'il faut pour travailler avec HTTP — c'est la classe URLSession. Souvenez-vous : pour 90% des tâches, vous n'avez pas besoin de bibliothèques tierces. URLSession est un outil puissant, flexible et natif.



1.1. Requête GET simple (ancien style)



Rappelons-nous comment cela se faisait avant. Vous pouvez encore rencontrer ce code dans des projets legacy :



let url = URL(string: "https://api.pythonlib.ru/users")!let task = URLSession.shared.dataTask(with: url) { data, response, error in    if let error = error {        print("Erreur : \\(error.localizedDescription)")        return    }    guard let data = data else {        print("Pas de données")        return    }    // Travailler avec data    print("Octets reçus : \\(data.count)")}task.resume()


Ce code fonctionne. Mais il a des inconvénients :

  • Callback hell — si vous devez enchaîner les requêtes, le code devient illisible.
  • Fuites mémoire — il est facile d'oublier weak self dans la closure.
  • Difficile à annuler — il faut conserver une référence à task.


En 2025, nous écrivons différemment.



1.2. Requête GET moderne avec async/await



Depuis Swift 5.5 (iOS 15, macOS 12), nous avons la concurrence structurée. Cela change tout :



func fetchUsers() async throws -> [User] {    let url = URL(string: "https://api.pythonlib.ru/users")!    let (data, response) = try await URLSession.shared.data(from: url)        guard let httpResponse = response as? HTTPURLResponse,          (200...299).contains(httpResponse.statusCode) else {        throw URLError(.badServerResponse)    }        return try JSONDecoder().decode([User].self, from: data)}


Magnifique, n'est-ce pas ? Pas de closures, pas de resume(). Le code se lit comme du code synchrone, mais s'exécute de manière asynchrone. C'est le standard de facto en 2025.



2. Requête POST : envoyer des données au serveur



Maintenant, envoyons des données. Supposons que nous devions créer un nouvel utilisateur.



2.1. POST avec corps JSON



func createUser(name: String, email: String) async throws -> User {    let url = URL(string: "https://api.pythonlib.ru/users")!    var request = URLRequest(url: url)    request.httpMethod = "POST"    request.setValue("application/json", forHTTPHeaderField: "Content-Type")        let body = ["name": name, "email": email]    request.httpBody = try JSONSerialization.data(withJSONObject: body)        let (data, response) = try await URLSession.shared.data(for: request)    // Traitement de la réponse...    return try JSONDecoder().decode(User.self, from: data)}

                
                

Blogs

Book Recommendations