{"meta":{"title":"Fazer a migração de REST para o GraphQL","intro":"Conheça as melhores práticas e considerações para migrar da GitHubAPI REST para a GitHubAPI do GraphQL.","product":"API GraphQL","breadcrumbs":[{"href":"/pt/graphql","title":"API GraphQL"},{"href":"/pt/graphql/guides","title":"Guias"},{"href":"/pt/graphql/guides/migrating-from-rest-to-graphql","title":"Migrar de REST para GraphQL"}],"documentType":"article"},"body":"# Fazer a migração de REST para o GraphQL\n\nConheça as melhores práticas e considerações para migrar da GitHubAPI REST para a GitHubAPI do GraphQL.\n\n## Diferenças na lógica da API\n\nGitHub fornece duas APIs: uma API REST e uma API do GraphQL. Para obter mais informações sobre as APIs de GitHub, consulte [Comparando a API REST do GitHub e a API do GraphQL](/pt/rest/about-the-rest-api/comparing-githubs-rest-api-and-graphql-api).\n\nFazer a migração da REST para o GraphQL representa uma mudança significativa na lógica da API. As diferenças entre a REST como um estilo e o GraphQL como uma especificação dificultam, e muitas vezes tornam indesejável, substituir chamadas à API REST por consultas de API do GraphQL individualmente. Incluímos abaixo exemplos específicos de migração.\n\nPara migrar seu código da [API REST](/pt/rest) para a API do GraphQL:\n\n* Revise a [especificação do GraphQL](https://spec.graphql.org/June2018/)\n* Examine o esquema [GraphQL do GitHub](/pt/graphql/reference)\n* Considere como qualquer código existente atualmente interage com a API REST do GitHub.\n* Use [Global Node IDs](/pt/graphql/guides/using-global-node-ids) para fazer referência a objetos entre versões de API\n\nAs vantagens significativas do GraphQL incluem:\n\n* [Obter os dados de que você precisa e somente isso](#example-getting-the-data-you-need-and-nothing-more)\n* [Campos aninhados](#example-nesting)\n* [Tipagem forte](#example-strong-typing)\n\nAqui estão exemplos de cada um.\n\n## Exemplo: Obter os dados de que você precisa e somente isso\n\nUma única chamada da REST API recupera uma lista dos membros da sua organização:\n\n```shell\ncurl -v https://api.github.com/orgs/:org/members\n```\n\nA carga da REST contém dados excessivos se seu objetivo é recuperar apenas nomes de integrantes e links para avatares. No entanto, uma consulta do GraphQL retorna apenas o que você especifica:\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\nConsidere outro exemplo: recuperar uma lista de pull requests e verificar se cada um é mesclável. Uma chamada à API REST recupera uma lista de solicitações de pull e as respectivas [representações de resumo](/pt/rest#summary-representations):\n\n```shell\ncurl -v https://api.github.com/repos/:owner/:repo/pulls\n```\n\nDeterminar se uma solicitação de pull pode ser mesclada exige a recuperação de cada solicitação de pull individualmente para obter sua representação detalhada (um volume grande de dados) e verificar se o atributo é verdadeiro ou falso:\n\n```shell\ncurl -v https://api.github.com/repos/:owner/:repo/pulls/:number\n```\n\nCom o GraphQL, você pode recuperar somente os atributos `number` e `mergeable` de cada solicitação de pull:\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## Exemplo: Aninhamento\n\nFazer consulta com campos aninhados permite substituir várias chamadas de REST por menos consultas do GraphQL. Por exemplo, a recuperação de uma solicitação de pull com os commits, comentários sem revisão e revisões usando a **API REST** exige quatro chamadas separadas:\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\nUsando a **API do GraphQL**, você pode recuperar os dados com uma só consulta usando campos aninhados:\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\nVocê também pode estender o poder dessa consulta [stituindo uma variável](/pt/graphql/guides/forming-calls-with-graphql#working-with-variables) para o número da solicitação de pull.\n\n## Exemplo: Tipagem forte\n\nOs esquemas do GraphQL são digitados de modo rígido, o que torna o gerenciamento dos dados mais seguro.\n\nConsidere um exemplo de adição de um comentário em uma pull request usando a [mutação](/pt/graphql/reference) do GraphOL e da especificação incorreta de um inteiro em vez de uma cadeia de caracteres para o valor de [`clientMutationId`](/pt/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\nExecutar esta consulta retorna erros especificando os tipos esperados para a operação:\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\nA colocação de `1234` entre aspas transforma o valor de um número inteiro em uma string, o tipo esperado:\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```"}