GitHub GraphQL API 的 Apollo 客户端响应不是 JSON 格式
Posted
技术标签:
【中文标题】GitHub GraphQL API 的 Apollo 客户端响应不是 JSON 格式【英文标题】:Apollo Client response not in JSON format for GitHub GraphQL APIs 【发布时间】:2019-06-19 18:45:00 【问题描述】:我正在使用 apollo-client 在 android 上试验 GraphQL,并且正在使用 GitHub 的 GraphQL API。我正在点击一个 API 来给我一个用户拥有的存储库列表。一切正常,但我得到的响应不是 JSON 格式,而是字符串格式。
响应如下所示:
Datauser=User__typename=User,
repositories=Repositories__typename=RepositoryConnection, nodes=
[Node__typename=Repository, name=testrepository]
当我尝试通过 Insomnia(GraphQL 休息客户端)点击 url 时,我得到 JSON 格式的响应,但在我的应用程序中,我得到上述格式的响应。我尝试在标题中传递 content-type : "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)
);
我想将响应放入模型类列表中,为此我需要 JSON 格式的响应。搜索了这个问题,但没有得到任何适当的解决方案。
我正在使用 apollo 客户端 0.3.2
[编辑:1]
我尝试使用 Okhttp 调用 GitHub GraphQL API,这次我得到了这样的响应:
"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 查询创建这些模型类,我如何创建这个模型类的列表。
我浏览了 github 上的 apollo sample-app,发现了这段代码:
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()方法返回的是feed列表,这个方法在apollo目录下自动生成的模型类文件中。我去检查了我的模型文件,没有返回 repos 列表的方法(如我的情况)。该文件太大,无法在此处发布,但如果社区想要查看它,我可以将其发布在这里。
顺便说一句,我用我的代码尝试过这样的事情:
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 目录中自动生成的模型文件中的一个类,这个类应该有一个返回 repo 模型类列表的方法。
我知道我在这里做错了。我认为还有其他方法可以创建这些模型类的列表。
【问题讨论】:
“响应看起来像这样”——请提供minimal reproducible example 显示您如何获得该输出。这看起来像是Data
类的 toString()
实现,这可能是完全合理的。
@CommonsWare 我已经编辑了我的问题
@CommonsWare 是的,我正在使用 toString() 但响应不是 JSON 格式
【参考方案1】:
响应不是 JSON 格式
响应是 JSON 格式。它现在采用githubRepoList.repoListAPI.FindQuery.Data
对象的形式。该类是根据您的 GraphQL 文档为您生成的代码。引用the Apollo-Android documentation,并强调:
Apollo-Android 是一个兼容 GraphQL 的客户端从标准 GraphQL 查询生成 Java 模型
特别是,Apollo-Android 在这些 Java 模型类上生成 toString()
实现。在你的情况下:
Data
在 user
字段中包含 User
User
包含 RepositoriesConnection
,重命名为 Repositories
,在 repositories
字段中
repositories
集合包含一个 Repository
使用 Apollo-Android 的原因是您不必自己处理 JSON。相反,如果您想自己解析 JSON,请摆脱 Apollo-Android,只使用 OkHttp 进行 Web 服务调用。
【讨论】:
我尝试使用 okhttp 拨打电话,但没有得到正确响应 @localhost:所以...只需使用您拥有的代码,然后从Data
对象中获取您的数据。 它已经为你解析了。
让我试试。我会发布我发现的任何内容
这是一个愚蠢的错误。回购列表位于 user().repositories().node() 下以上是关于GitHub GraphQL API 的 Apollo 客户端响应不是 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章
Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API
markdown Github API v4 GraphQL
GitHub V4 GraphQL API with Java 使用一些 GraphQL Java 库(如果可用)
Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API