{"meta":{"title":"Migration de REST vers GraphQL","intro":"Découvrez les meilleures pratiques et considérations relatives à la migration de l’API REST vers GitHubGitHubl’API GraphQL.","product":"GraphQL API","breadcrumbs":[{"href":"/fr/enterprise-cloud@latest/graphql","title":"GraphQL API"},{"href":"/fr/enterprise-cloud@latest/graphql/guides","title":"Guides"},{"href":"/fr/enterprise-cloud@latest/graphql/guides/migrating-from-rest-to-graphql","title":"Migrer de REST vers GraphQL"}],"documentType":"article"},"body":"# Migration de REST vers GraphQL\n\nDécouvrez les meilleures pratiques et considérations relatives à la migration de l’API REST vers GitHubGitHubl’API GraphQL.\n\n## Différences dans la logique d’API\n\nGitHub fournit deux API : une API REST et une API GraphQL. Pour plus d’informations sur GitHubles API, consultez [Comparaison de l'API REST de GitHub et de l'API GraphQL](/fr/enterprise-cloud@latest/rest/about-the-rest-api/comparing-githubs-rest-api-and-graphql-api).\n\nLa migration de REST vers GraphQL représente un changement important dans la logique d’API. Les différences entre REST en tant que style et GraphQL en tant que spécification rendent difficile, et souvent non souhaitable, le remplacement individuel des appels d’API REST par des requêtes d’API GraphQL. Nous avons inclus des exemples spécifiques de migration ci-dessous.\n\nPour migrer votre code de l’[API REST](/fr/enterprise-cloud@latest/rest) vers l’API GraphQL :\n\n* Examinez la [spécification GraphQL](https://spec.graphql.org/June2018/)\n* Passez en revue le schéma [GraphQL de GitHub](/fr/enterprise-cloud@latest/graphql/reference)\n* Réfléchissez à la façon dont le code existant que vous avez actuellement interagit avec l’API REST GitHub\n* Utilisez les ID de nœud [Global Node](/fr/enterprise-cloud@latest/graphql/guides/using-global-node-ids) pour référencer des objets entre les versions de l’API\n\nGraphQL présente les avantages significatifs suivants :\n\n* [Obtention des données dont vous avez besoin, et rien de plus](#example-getting-the-data-you-need-and-nothing-more)\n* [Champs imbriqués](#example-nesting)\n* [Typage fort](#example-strong-typing)\n\nVoici quelques exemples de chacun d’entre eux.\n\n## Exemple : Obtention des données dont vous avez besoin, et rien de plus\n\nUn seul appel d’API REST récupère une liste des membres de votre organisation :\n\n```shell\ncurl -v https://api.github.com/orgs/:org/members\n```\n\nLa charge utile REST contient des données excessives si votre objectif est de récupérer uniquement des noms de membres et des liens vers des avatars. En revanche, une requête GraphQL retourne uniquement ce que vous spécifiez :\n\n```graphql\nquery {\n    organization(login:\"github\") {\n    membersWithRole(first: 100) {\n      edges {\n        node {\n          name\n          avatarUrl\n        }\n      }\n    }\n  }\n}\n```\n\nPrenons un autre exemple : récupération d’une liste de demandes de tirage (pull request) et vérification de la possibilité, pour chacune d’elles, d’être fusionnée. Un appel à l’API REST récupère une liste de demandes de tirage et leurs [représentations récapitulatives](/fr/enterprise-cloud@latest/rest#summary-representations) :\n\n```shell\ncurl -v https://api.github.com/repos/:owner/:repo/pulls\n```\n\nDéterminer si une demande de tirage peut être fusionnée nécessite de récupérer chaque demande de tirage individuellement pour obtenir sa [représentation détaillée](/fr/enterprise-cloud@latest/rest#detailed-representations) (une charge utile volumineuse) et de vérifier si son attribut `mergeable` a la valeur true ou false :\n\n```shell\ncurl -v https://api.github.com/repos/:owner/:repo/pulls/:number\n```\n\nAvec GraphQL, vous pouvez récupérer uniquement les attributs `number` et `mergeable` de chaque demande de tirage :\n\n```graphql\nquery {\n    repository(owner:\"octocat\", name:\"Hello-World\") {\n    pullRequests(last: 10) {\n      edges {\n        node {\n          number\n          mergeable\n        }\n      }\n    }\n  }\n}\n```\n\n## Exemple : Imbrication\n\nL’interrogation avec des champs imbriqués vous permet de remplacer plusieurs appels REST par moins de requêtes GraphQL. Par exemple, récupérer une pull request avec ses commits, ses commentaires non liés à une révision et ses critiques à l’aide de l’**API REST** nécessite quatre appels distincts :\n\n```shell\ncurl -v https://api.github.com/repos/:owner/:repo/pulls/:number\ncurl -v https://api.github.com/repos/:owner/:repo/pulls/:number/commits\ncurl -v https://api.github.com/repos/:owner/:repo/issues/:number/comments\ncurl -v https://api.github.com/repos/:owner/:repo/pulls/:number/reviews\n```\n\nÀ l’aide de l’**API GraphQL**, vous pouvez récupérer les données avec une seule requête à l’aide de champs imbriqués :\n\n```graphql\n{\n  repository(owner: \"octocat\", name: \"Hello-World\") {\n    pullRequest(number: 1) {\n      commits(first: 10) {\n        edges {\n          node {\n            commit {\n              oid\n              message\n            }\n          }\n        }\n      }\n      comments(first: 10) {\n        edges {\n          node {\n            body\n            author {\n              login\n            }\n          }\n        }\n      }\n      reviews(first: 10) {\n        edges {\n          node {\n            state\n          }\n        }\n      }\n    }\n  }\n}\n```\n\nVous pouvez également étendre la puissance de cette requête en [substituant une variable](/fr/enterprise-cloud@latest/graphql/guides/forming-calls-with-graphql#working-with-variables) pour le numéro de demande de tirage.\n\n## Exemple : Typage fort\n\nLes schémas GraphQL sont fortement typés, ce qui rend la gestion des données plus sûre.\n\nPrenons un exemple d’ajout d’un commentaire à un ticket ou à une pull request à l’aide d’une [mutation](/fr/enterprise-cloud@latest/graphql/reference) GraphQL, en spécifiant par erreur un entier plutôt qu’une chaîne de caractères pour la valeur de [`clientMutationId`](/fr/enterprise-cloud@latest/graphql/reference/issues#mutation-addcomment) :\n\n```graphql\nmutation {\n  addComment(input:{clientMutationId: 1234, subjectId: \"MDA6SXNzdWUyMjcyMDA2MTT=\", body: \"Looks good to me!\"}) {\n    clientMutationId\n    commentEdge {\n      node {\n        body\n        repository {\n          id\n          name\n          nameWithOwner\n        }\n        issue {\n          number\n        }\n      }\n    }\n  }\n}\n```\n\nL’exécution de cette requête retourne des erreurs spécifiant les types attendus pour l’opération :\n\n```json\n{\n  \"data\": null,\n  \"errors\": [\n    {\n      \"message\": \"Argument 'input' on Field 'addComment' has an invalid value. Expected type 'AddCommentInput!'.\",\n      \"locations\": [\n        {\n          \"line\": 3,\n          \"column\": 3\n        }\n      ]\n    },\n    {\n      \"message\": \"Argument 'clientMutationId' on InputObject 'AddCommentInput' has an invalid value. Expected type 'String'.\",\n      \"locations\": [\n        {\n          \"line\": 3,\n          \"column\": 20\n        }\n      ]\n    }\n  ]\n}\n```\n\nPlacer `1234` entre guillemets transforme la valeur entière en chaîne de caractères, le type attendu :\n\n```graphql\nmutation {\n  addComment(input:{clientMutationId: \"1234\", subjectId: \"MDA6SXNzdWUyMjcyMDA2MTT=\", body: \"Looks good to me!\"}) {\n    clientMutationId\n    commentEdge {\n      node {\n        body\n        repository {\n          id\n          name\n          nameWithOwner\n        }\n        issue {\n          number\n        }\n      }\n    }\n  }\n}\n```"}