GraphQL vs REST en Swift : que choisir pour un développeur iOS en 2025

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 : REST vs GraphQL — l'ancien combat dans le nouveau monde Swift



Il était une fois, à l'époque de l'Objective-C et de la répartition par sélecteurs, le choix entre REST et GraphQL n'était pas si crucial. REST était roi, et JSON son fidèle écuyer. Mais les temps ont changé. Swift est devenu un langage avec un système de typage fort, async/await, Codable et des frameworks puissants comme Apollo iOS sont apparus. Maintenant, la question « REST ou GraphQL ? » sonne différemment : « Qu'est-ce qui apportera le plus de valeur à mon projet Swift ? ».



Dans cet article, nous ne allons pas réciter Wikipédia. Nous allons prendre un exemple concret d'application iOS pour une plateforme éducative (oui, la fameuse PythonLib) et voir comment chaque approche se comporte en code Swift. Vous découvrirez quand REST est toujours roi, et quand GraphQL est un véritable sauveur.



L'essentiel en bref : en quoi REST diffère de GraphQL



Pour ceux qui découvrent le sujet — les concepts de base.



  • REST — c'est un style architectural où chaque ressource (utilisateur, cours, leçon) a sa propre URL. Vous recevez une structure de données fixe que le serveur a décidé de vous renvoyer. Souvent — tout un tas d'informations superflues.
  • GraphQL — c'est un langage de requêtes. Vous décidez vous-même quels champs sont nécessaires. Un seul point d'entrée (/graphql) et une seule requête peut remplacer plusieurs requêtes REST.


Sur le papier, GraphQL ressemble à une balle d'argent. Mais dans les projets Swift, il y a des nuances que nous allons maintenant analyser en pratique.



Exemple 1 : Récupérer le profil d'un utilisateur et ses cours



Approche REST en Swift (URLSession + Codable)



Supposons que nous ayons une API REST classique. Pour afficher le profil et la liste des cours, deux requêtes sont nécessaires :



// Modèlesstruct UserProfile: Codable {    let id: Int    let name: String    let email: String    let avatarURL: String}

struct Course: Codable { let id: Int let title: String let progress: Double}

// Couche réseaufunc fetchUserProfile(userId: Int) async throws -> UserProfile { let url = URL(string: "https://api.pythonlib.ru/users/\\(userId)")! let (data, _) = try await URLSession.shared.data(from: url) return try JSONDecoder().decode(UserProfile.self, from: data)}

func fetchCourses(userId: Int) async throws -> [Course] { let url = URL(string: "https://api.pythonlib.ru/users/\\(userId)/courses")! let (data, _) = try await URLSession.shared.data(from: url) return try JSONDecoder().decode([Course].self, from: data)}

// Utilisationlet profile = try await fetchUserProfile(userId: 42)let courses = try await fetchCourses(userId: 42)


Tout est simple et prévisible. Mais il y a un problème : nous recevons tous les champs du profil, même si nous n'avons besoin que du nom et de l'email. Et en plus — deux requêtes réseau. Sur une connexion lente, c'est douloureux.



Approche GraphQL en Swift (Apollo iOS)



Maintenant, la même chose, mais via GraphQL. D'abord, on définit la requête dans un fichier .graphql :



query GetUserWithCourses($userId: ID!) {    user(id: $userId) {        id        name        email        courses {            id            title            progress        }    }}


Apollo génère automatiquement du code Swift typé. Dans Xcode, cela ressemble à ceci :



import Apollo

let apolloClient = ApolloClient(url: URL(string: "https://api.pythonlib.ru/graphql")!)

func fetchUserWithCourses(userId: Int) async throws -> GetUserWithCoursesQuery.Data { return try await withCheckedThrowingContinuation { continuation in apolloClient.fetch(query: GetUserWithCoursesQuery(userId: userId)) { result in switch result { case .success(let graphQLResult): if let data = graphQLResult.data { continuation.resume(returning: data) } else if let errors = graphQLResult.errors {

Blogs

Book Recommendations