Неверный запрос при попытке доступа к API Github v4 с помощью graphql.js

Я пытаюсь получить некоторые данные из Github GraphQL API, используя библиотеку graphql.js.

var graph = graphql("https://api.github.com/graphql", {
  method: "POST",
  headers: {
    "Authorization": "Bearer <my-token-here>",
    "Content-Type": "application/json"
  },
  fragments: {
    rateLimitInfo: "on RateLimit {cost,remaining,resetAt}"
  }
});
graph(`
    query repo($name: String!, $owner: String!){
        repository(name:$name, owner:$owner){
            id      
        }
    }
`,{
    name: "freeCodeCamp",
    owner: "freeCodeCamp"
}).then(function(response){
    console.log(response);
}).catch(function(error){
    console.log(error);
});

Мое обещание не выполняется и всегда терпит неудачу. Я получаю ответ HTTP с кодом 400 (неверный запрос), а аргумент error функции catch гласит:

{
    message: "Problems parsing JSON", 
    documentation_url: "https://developer.github.com/v3"
}

Я уже пробовал передавать переменные как JSON, например:

{
    "name": "freeCodeCamp",
    "owner": "freeCodeCamp"
}

Но это не помогло. У меня такой же плохой запрос.

Глядя на вкладку «Сеть» инспектора Chrome, я вижу, что такое полезная нагрузка запроса. Добавление его здесь на случай, если он даст какие-либо подсказки или помощь.

query=query%20repo(%24name%3A%20String!%2C%20%24owner%3A%20String!)%7Brepository(name%3A%24name%2C%20owner%3A%24owner)%7Bid%7D%7D&variables=%7B%22name%22%3A%22freeCodeCamp%22%2C%22owner%22%3A%22freeCodeCamp%22%7D

Что я делаю не так?


person FTM    schedule 20.01.2018    source источник
comment
Похоже, что форма, которую graphql.js формирует для полезной нагрузки данных, не соответствует формату, ожидаемому Github API.   -  person FTM    schedule 20.01.2018


Ответы (1)


Поведение по умолчанию graphql.js заключается в отправке тела в формате с кодировкой form-url, тогда как Github GraphQL API принимает только формат JSON. Из файлов ознакомления с graphql.js:

По умолчанию GraphQL.js отправляет запрос POST. Но вы можете изменить поведение, установив asJSON.

var graph = graphql("http://localhost:3000/graphql", {   
    asJSON: true
});

Вы можете увидеть разницу здесь

Следующее будет работать как положено:

var graph = graphql("https://api.github.com/graphql", {
  headers: {
    "Authorization": "Bearer YOUR_ACCESS_TOKEN"
  },
  asJSON: true
});
graph(`
    query repo($name: String!, $owner: String!){
        repository(name:$name, owner:$owner){
            id      
        }
    }
`, {
  name: "freeCodeCamp",
  owner: "freeCodeCamp"
}).then(function(response) {
  console.log(response);
}).catch(function(error) {
  console.log(error);
});
person Bertrand Martel    schedule 26.01.2018
comment
Я пытался запустить ваш код из html-файла, но он не работает. Спросил людей, поддерживающих GraphQL.js, но ответа не получил. Любая идея, почему это потерпит неудачу? - person jar; 01.10.2019