Я экспериментирую с GraphQL на Android с помощью apollo-client и использую API-интерфейс GraphQL от GitHub.Я использую API, чтобы получить список репозиториев, принадлежащих пользователю.Все работает нормально, но я получаю ответ не в формате JSON, а в формате String.
Ответ выглядит следующим образом:
Data{user=User{__typename=User,
repositories=Repositories{__typename=RepositoryConnection, nodes=
[Node{__typename=Repository, name=testrepository}]}}
, когда я пытаюсь нажать на ссылку через Insomnia (GraphQL)остальные клиенты) Я получаю ответ в формате JSON, но в своем приложении я получаю ответ в вышеуказанном формате.Я попытался передать тип содержимого: "application / json; charset = utf-8" в заголовке, но безуспешно.
Вот как я получаю ответ:
public void fetchRepoList(String userName, String authHeader, final ResponseCallback responseCallback) {
GraphQL.getInstance().getApolloClient(authHeader)
.query(githubRepoList.repoListAPI.FindQuery.builder().repoOwner(userName).build())
.enqueue(new ApolloCall.Callback<githubRepoList.repoListAPI.FindQuery.Data>() {
@Override
public void onResponse(@Nonnull Response<githubRepoList.repoListAPI.FindQuery.Data> response) {
Log.d(TAG, "response" + response)
}
@Override
public void onFailure(@Nonnull final ApolloException exception) {
}
});
}
Я хочупоместить ответ в класс List of Model и для этого мне нужен ответ в формате JSON.Искал эту проблему, но не нашел правильного решения.
Я использую клиент apollo 0.3.2
[Редактировать: 1]
Я попытался позвонить в GitHub GraphQL API с помощью Okhttp ина этот раз я получил этот ответ:
{"data":{"__schema":{"queryType":{"name":"Query"},"mutationType":{"name":"Mutation"},"subscriptionType":null,"types":[{"kind":"SCALAR","name":"Boolean","description":"Represents `true` or `false` values.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"SCALAR","name":"String","description":"Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.","fields":null,"inputFields":null,"interfaces":null,"enumValues":null,"possibleTypes":null},{"kind":"OBJECT","name":"Query","description":"The query root of GitHub's GraphQL interface.","fields":[{"name":"codeOfConduct","description":"Look up a code of conduct by its key","args":[{"name":"key","description":"The code of conduct's key","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"CodeOfConduct","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"codesOfConduct","description":"Look up a code of conduct by its key","args":[],"type":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"CodeOfConduct","ofType":null}},"isDeprecated":false,"deprecationReason":null},{"name":"license","description":"Look up an open source license by its key","args":[{"name":"key","description":"The license's downcased SPDX ID","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"License","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"licenses","description":"Return a list of known open source licenses","args":[],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"OBJECT","name":"License","ofType":null}}},"isDeprecated":false,"deprecationReason":null},{"name":"marketplaceCategories","description":"Get alphabetically sorted list of Marketplace categories","args":[{"name":"includeCategories","description":"Return only the specified categories.","type":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}}},"defaultValue":null},{"name":"excludeEmpty","description":"Exclude categories with no listings.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null},{"name":"excludeSubcategories","description":"Returns top level categories only, excluding any subcategories.","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null}],"type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"LIST","name":null,"ofType":{"kind":"NON_NULL","name":null,"ofType":{"kind":"OBJECT","name":"MarketplaceCategory","ofType":null}}}},"isDeprecated":false,"deprecationReason":null},{"name":"marketplaceCategory","description":"Look up a Marketplace category by its slug.","args":[{"name":"slug","description":"The URL slug of the category.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null},{"name":"useTopicAliases","description":"Also check topic aliases for the category slug","type":{"kind":"SCALAR","name":"Boolean","ofType":null},"defaultValue":null}],"type":{"kind":"OBJECT","name":"MarketplaceCategory","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"marketplaceListing","description":"Look up a single Marketplace listing","args":[{"name":"slug","description":"Select the listing that matches this slug. It's the short name of the listing used in its URL.","type":{"kind":"NON_NULL","name":null,"ofType":{"kind":"SCALAR","name":"String","ofType":null}},"defaultValue":null}],"type":{"kind":"OBJECT","name":"MarketplaceListing","ofType":null},"isDeprecated":false,"deprecationReason":null},{"name":"marketplaceListings","description":"Look up Marketplace listings","args":[{"name":"after","description":"Returns the elements in the list that come after the specified cursor.","type"
Этот ответ даже не содержит необходимых данных о репозиториях.Он даже не связан со списком репозиториев.
Поэтому я вернулся к старому методу и сделал вызов с помощью apollo.Теперь, так как apollo создает эти классы моделей из стандартных запросов GraphQL, как мне создать список этого класса моделей.
Я просмотрел пример приложения apollo на github и наткнулся на этот фрагмент кода:
List<FeedEntry> feedResponseToEntriesWithRepositories(Response<FeedQuery.Data> response) {
List<FeedEntry> feedEntriesWithRepos = new ArrayList<>();
final FeedQuery.Data responseData = response.data();
if (responseData == null) {
return Collections.emptyList();
}
final List<FeedEntry> feedEntries = responseData.feedEntries();
if (feedEntries == null) {
return Collections.emptyList();
}
for (FeedEntry entry : feedEntries) {
if (entry.repository() != null) {
feedEntriesWithRepos.add(entry);
}
}
return feedEntriesWithRepos;
}
Здесь метод feedEntries () возвращает список каналов, этот метод находится вавтоматически сгенерированный файл класса модели в каталоге apollo.Я пошел и проверил мой файл модели, и не было методов, которые возвращали бы список репозиториев (как в моем случае).Файл слишком велик для размещения здесь, но если сообщество хочет посмотреть его, я могу опубликовать его здесь.
Кстати, я попробовал что-то подобное с моим кодом:
List<githubRepoList.repoListAPI.FindQuery.Node> repoList = new ArrayList<>();
final githubRepoList.repoListAPI.FindQuery.Data repoListData = response.data();
final List<githubRepoList.repoListAPI.FindQuery.Node> finalRepoList = repoListData.(which method to call from the auto-generated class file?)
Здесь Node - это класс в моем автоматически сгенерированном файле модели в каталоге apollo, и этот класс должен иметьметод, который возвращает список класса модели репо.
Я знаю, что здесь что-то не так.Я думаю, что есть какой-то другой способ создания списка этих модельных классов.