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 selfdans 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
Lire aussi
Algorithmes et structures de données en TypeScript : guide complet
Les 10 meilleurs frameworks TypeScript pour le développement web en 2024
Concaténation de std::vector en C++ : 3 meilleures méthodes avec exemples
Comment obtenir l'aperçu d'une vidéo YouTube via l'API : 5 erreurs fatales en PHP
Code review en Swift : que vérifier et comment donner un retour d'information