GraphQL API avec Swift : tutoriel pratique étape par étape

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 à GraphQL et Swift

\n

GraphQL est un langage de requête pour API qui permet aux clients d'obtenir exactement les données dont ils ont besoin, et rien de superflu. Pour les développeurs iOS et macOS, l'intégration de GraphQL ouvre de nouvelles possibilités pour créer des applications mobiles efficaces et flexibles. Dans ce tutoriel, nous allons voir en pratique comment connecter une API GraphQL à un projet Swift, effectuer des requêtes et mutations de base, et gérer les erreurs potentielles.

\n

Contrairement au REST traditionnel, GraphQL permet de demander plusieurs ressources en une seule requête, ce qui est particulièrement important pour les appareils mobiles avec un trafic limité. Nous utiliserons la bibliothèque populaire Apollo iOS — la solution la plus stable et la mieux documentée pour travailler avec GraphQL en Swift.

\n\n

Préparation du projet et installation d'Apollo iOS

\n

Étape 1 : Création du projet et installation des dépendances

\n

Ouvrez Xcode et créez un nouveau projet iOS (ou macOS). Pour travailler avec GraphQL, nous installerons Apollo iOS via Swift Package Manager (SPM).

\n
    \n
  1. Dans Xcode, sélectionnez File → Add Packages
  2. \n
  3. Collez l'URL du dépôt : https://github.com/apollographql/apollo-ios.git
  4. \n
  5. Sélectionnez la dernière version stable (au moment de la rédaction — 1.15+)
  6. \n
  7. Ajoutez le paquet à votre cible
  8. \n
\n\n

Étape 2 : Génération de code à partir du schéma GraphQL

\n

Apollo iOS utilise la génération de code : vous décrivez les requêtes dans des fichiers .graphql, et l'utilitaire crée du code Swift typé. Pour cela, il faut :

\n
    \n
  1. Créez un dossier GraphQL dans le projet
  2. \n
  3. Placez-y le fichier schema.graphqls (le schéma de votre API) — généralement obtenu via introspection
  4. \n
  5. Créez un fichier de requête, par exemple GetUser.graphql :
  6. \n
\n\n
query GetUser($id: ID!) {\n  user(id: $id) {\n    id\n    name\n    email\n    posts {\n      title\n    }\n  }\n}
\n\n

Ensuite, ajoutez une Build Phase avec l'exécution du générateur de code. Le plus simple est d'installer Apollo CLI via Homebrew :

\n
brew install apollo-ios-cli
\n\n

Et exécutez la commande à la racine du projet :

\n
./apollo-ios-cli generate
\n\n

Après cela, des fichiers Swift générés avec les modèles de données apparaîtront dans le dossier Sources/API.

\n\n

Exécution de requêtes GraphQL de base

\n

Configuration du client Apollo

\n

Créez une instance du client Apollo en spécifiant l'URL de votre endpoint GraphQL. Cela se fait généralement dans AppDelegate ou dans une classe de service séparée :

\n\n
import Apollo\n\nclass NetworkService {\n    static let shared = NetworkService()\n    private(set) lazy var apollo: ApolloClient = {\n        let url = URL(string: "https://your-api.com/graphql")!\n        return ApolloClient(url: url)\n    }()\n}
\n\n

Requête de données (Query)

\n

Maintenant, effectuons une requête pour obtenir un utilisateur. Le code généré créera une structure GetUserQuery :

\n\n
import Foundation\n\nclass UserViewModel: ObservableObject {\n    @Published var user: User?\n    @Published var errorMessage: String?\n    \n    func fetchUser(id: String) {\n        NetworkService.shared.apollo.fetch(query: GetUserQuery(id: id)) { [weak self] result in\n            DispatchQueue.main.async {\n                switch result {\n                case .success(let graphQLResult):\n                    if let userData = graphQLResult.data?.user {\n                        self?.user = User(\n                            id: userData.id,\n                            name: userData.name,\n                            email: userData.email\n                        )\n                    }\n                case .failure(let error):\n                    self?.errorMessage = "Erreur : \\(error.localizedDescription)"\n                }\n            }\n        }\n    }\n}
\n\n

Notez que nous utilisons @Published pour la mise à jour réactive de l'interface utilisateur dans

Blogs

Book Recommendations