API en Swift : de la théorie aux requêtes réelles
\n\nChaque développeur iOS se retrouve tôt ou tard confronté à la nécessité de faire communiquer l'application avec le serveur. Qu'il s'agisse de charger un fil d'actualités, d'envoyer des données de formulaire ou de faire du streaming en temps réel — on ne peut pas se passer d'API (Application Programming Interface). Mais quel protocole choisir ? Le classique REST, le flexible GraphQL ou l'ultra-rapide gRPC ?
\n\nDans cet article, nous ne nous contenterons pas d'énumérer les avantages et les inconvénients. Nous analyserons le travail avec les API en Swift sur des exemples concrets, montrerons du code et donnerons des conseils pratiques. Vous apprendrez à structurer correctement la couche réseau, quelles bibliothèques utiliser et quand chaque approche devient le meilleur choix.
\n\nSi vous codez en Swift et souhaitez que votre application communique avec le backend rapidement, de manière fiable et élégante — cet article est pour vous. C'est parti !
\n\nAPI REST en Swift : un classique qui ne vieillit pas
\n\nREST (Representational State Transfer) est un style architectural qui utilise les méthodes HTTP (GET, POST, PUT, DELETE) pour travailler avec des ressources. La plupart des API publiques (GitHub, Twitter, Stripe) sont construites sur REST. Pour un développeur Swift, cela signifie travailler avec JSON, URLSession ou Alamofire.
\n\nRequête GET de base avec URLSession
\n\nCommençons par le plus simple — la récupération de données. Imaginons que nous devions charger une liste d'utilisateurs depuis JSONPlaceholder :
\n\nimport Foundation\n\nstruct User: Codable {\n let id: Int\n let name: String\n let email: String\n}\n\nfunc fetchUsers() async throws -> [User] {\n let url = URL(string: "https://jsonplaceholder.typicode.com/users")!\n let (data, response) = try await URLSession.shared.data(from: url)\n \n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n throw URLError(.badServerResponse)\n }\n \n return try JSONDecoder().decode([User].self, from: data)\n}\n\nTask {\n do {\n let users = try await fetchUsers()\n print("Chargé \\(users.count) utilisateurs")\n } catch {\n print("Erreur : \\(error.localizedDescription)")\n }\n}\n\nRemarquez l'utilisation de async/await — c'est la façon moderne de travailler avec du code asynchrone en Swift. Le code devient lisible et concis, sans closures ni callbacks.
Requête POST avec Alamofire
\n\nAlamofire est la bibliothèque la plus populaire pour le travail réseau en Swift. Elle simplifie la gestion des erreurs, l'encodage des paramètres et le téléchargement de fichiers. Voici un exemple d'envoi de données :
\n\nimport Alamofire\n\nstruct NewUser: Encodable {\n let name: String\n let email: String\n}\n\nAF.request("https://jsonplaceholder.typicode.com/users",\n method: .post,\n parameters: NewUser(name: "Ivan", email: "ivan@example.com"),\n encoder: JSONParameterEncoder.default)\n .validate()\n .responseDecodable(of: User.self) { response in\n switch response.result {\n case .success(let user):\n print("Utilisateur créé avec l'id : \\(user.id)")\n case .failure(let error):\n print("Erreur : \\(error.localizedDescription)")\n }\n }\n\nConseil : Utilisez .validate() — cela vérifiera automatiquement le code de statut et convertira les erreurs HTTP en erreurs Alamofire. Votre code sera plus propre et le débogage plus simple.
Quand REST est-il le meilleur choix ?
\n- \n
- Vous avez une application CRUD simple (notes, liste de tâches). \n
- L'API fournit des endpoints fixes. \n
- Vous n'avez pas besoin d'imbrication complexe des données. \n
GraphQL en Swift : la flexibilité des requêtes
\n\nGraphQL est un langage de requêtes qui permet au client de demander exactement les données dont il a besoin. Ni sur-récupération (over-fetching) ni sous-récupération (under-fetching). Pour Swift, il existe une excellente bibliothèque Apollo iOS