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 : pourquoi il est important de savoir travailler avec HTTP en Swift

\n

Les applications mobiles et de bureau modernes existent rarement de manière isolée. Pratiquement toute application — du widget météo au client bancaire — échange des données avec un serveur. Pour cela, on utilise le protocole HTTP, et du côté de Swift (iOS/macOS), l'outil principal est le framework Foundation et sa classe URLSession.

\n

Dans cet article, nous allons voir comment créer correctement un client HTTP en Swift : d'une simple requête GET à la gestion complexe des erreurs et au travail avec JSON. Ce contenu sera utile aussi bien aux débutants qui découvrent le développement iOS qu'aux développeurs expérimentés souhaitant systématiser leurs connaissances.

\n

Nous aborderons l'approche moderne avec async/await (Swift 5.5+), qui rend le code propre et lisible, ainsi que les méthodes classiques avec les closures (completion handlers) pour la rétrocompatibilité.

\n\n

Les bases d'URLSession : création et configuration

\n

La classe URLSession est le principal « chef d'orchestre » des requêtes réseau en Swift. Elle gère les connexions, la mise en cache et l'authentification. Avant d'effectuer des requêtes, il faut créer une instance de session.

\n\n

Types de sessions

\n
    \n
  • Partagée (singleton) : URLSession.shared — une session simple sans personnalisation. Convient pour les requêtes de base.
  • \n
  • Par défaut : URLSession(configuration: .default) — permet de configurer les délais d'attente, le cache et les en-têtes.
  • \n
  • Éphémère : URLSession(configuration: .ephemeral) — ne sauvegarde pas le cache ni les cookies sur le disque. Idéal pour les données privées.
  • \n
  • Arrière-plan : URLSession(configuration: .background(withIdentifier:)) — pour le téléchargement/l'envoi de données en arrière-plan, même lorsque l'application est réduite.
  • \n
\n\n
import Foundation\n\n// Session simple\nlet sharedSession = URLSession.shared\n\n// Session personnalisée avec un délai d'attente de 30 secondes\nlet config = URLSessionConfiguration.default\nconfig.timeoutIntervalForRequest = 30\nconfig.timeoutIntervalForResource = 60\nlet customSession = URLSession(configuration: config)\n
\n\n

Création et envoi de requêtes HTTP

\n

La requête est construite à l'aide de la classe URLRequest. Elle contient l'URL, la méthode HTTP, les en-têtes et le corps de la requête. Examinons les méthodes principales : GET et POST.

\n\n

Requête GET avec async/await (approche moderne)

\n

Depuis Swift 5.5, Apple a ajouté la prise en charge des fonctions asynchrones (async/await). C'est la manière la plus concise et la plus sûre de travailler avec le réseau.

\n\n
func fetchData(from urlString: String) async throws -> Data {\n    guard let url = URL(string: urlString) else {\n        throw URLError(.badURL)\n    }\n    \n    var request = URLRequest(url: url)\n    request.httpMethod = "GET"\n    request.setValue("application/json", forHTTPHeaderField: "Accept")\n    \n    let (data, response) = try await URLSession.shared.data(for: request)\n    \n    // Vérification du statut HTTP\n    guard let httpResponse = response as? HTTPURLResponse,\n          (200...299).contains(httpResponse.statusCode) else {\n        throw URLError(.badServerResponse)\n    }\n    \n    return data\n}\n\n// Utilisation :\nTask {\n    do {\n        let data = try await fetchData(from: "https://api.example.com/users")\n        print("Reçu \\(data.count) octets")\n    } catch {\n        print("Erreur : \\(error.localizedDescription)")\n    }\n}\n
\n\n

Requête POST avec corps JSON

\n

Pour envoyer des données au serveur, on utilise la méthode POST. Le corps de la requête est généralement encodé en JSON.

\n\n
struct User: Codable {\n    let name: String\n    let email: String\n}\n\nfunc createUser(_ user: User) async throws -> Data {\n    let url = URL(string: "https://api.example.com/users")!\n    var request = URLRequest(url: url)\n    request.httpMethod = "POST"\n    request.setValue("application                

Blogs

Book Recommendations