Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)
Posted
技术标签:
【中文标题】Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)【英文标题】:Apollo Client Can't Connect To GraphQL Server (http call fails to execute) 【发布时间】:2019-12-10 12:51:36 【问题描述】:我正在尝试设置一个简单的 android 应用程序,该应用程序通过使用 Java GraphQL 的 Springboot 应用程序连接到我的本地主机上设置的 GraphQL 服务器。使用 GraphiQL 我可以很好地查询。问题是当我尝试使用 Apollo 客户端在我的应用程序中进行相同的查询时,我收到以下错误
“com.apollographql.apollo.exception.ApolloNetworkException:无法执行http调用”
我使用this tutorial 通过 Springboot 设置 GraphQL 服务器并定义 GraphQL 架构。我依靠this tutorial 来帮助设置应用程序。
之前我尝试通过网络浏览器访问服务器,但我会收到一条错误消息
“出现意外错误(类型=错误请求,状态=400)。 所需的字符串参数“查询”不存在"
所以我尝试了 Postman 并将在 GraphiQL 中工作的相同查询发送到本地主机并返回错误。这是使用 GET 请求完成的,所以我尝试使用 POST 代替,它像在 GraphiQL 中一样工作得很好。所以我认为出于某种原因,我通过 Springboot 设置的 GraphQL 服务器不适用于 GET 请求。我不知道这是否是因为我在设置时搞砸了,或者这只是 GraphQL 处理查询的方式,但如果有人能就此告诉我,我将不胜感激。
不管怎样,我设置了一个断点并单步执行应用程序,发现 Apollo 也通过 GET 请求发送查询,我假设这是问题的根源。 我做了一个错误并误读了代码,我知道它肯定不是发送 GET 请求,但问题仍然存在,我不知道为什么。
这是主要活动
private static final String BASE_URL =
"http://xxx.xxx.xxx.xxx:8080/graphql";
private static final String TAG = "MainActivity";
private TextView textBox;
private Button queryButton;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textBox = (TextView) findViewById(R.id.plainbox);
queryButton = (Button) findViewById(R.id.queryButton);
OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
ApolloClient apolloClient = ApolloClient.builder()
.serverUrl(BASE_URL)
.okHttpClient(okHttpClient)
.build();
BookByIdQuery bookQuery = BookByIdQuery.builder()
.id("book-1")
.build();
queryButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
apolloClient.query(bookQuery).enqueue(new ApolloCall.Callback<BookByIdQuery.Data>()
@Override
public void onResponse(@NotNull Response<BookByIdQuery.Data> dataResponse)
Log.d(TAG, "Got Response: \n" + dataResponse.toString());
textBox.setText(dataResponse.data().toString());
@Override
public void onFailure(@NotNull ApolloException a)
Log.d(TAG, "Failed, ApolloException " + a);
); // end apolloClient query
这是 graphQL 查询文件。
query BookById($id : ID)
Book: bookById(id : $id)
name
author
firstName
lastName
所以在这一点上我有点茫然。有没有办法使用 POST 而不是 GET 请求通过 Apollo 客户端发送我的查询?还是让 GraphQL 服务器接受 GET 请求更好,并且可能?
我只是对为什么 ApolloClient 一直无法进行 http 调用感到困惑,不幸的是,这个错误描述性不是很强,所以我有点难过。
老实说,我认为 GET 请求可以正常工作,甚至是首选,因为我只是请求返回数据,而不是尝试添加任何内容。感谢你们提供的任何帮助,并在此先感谢!
e:讨论一下,问题可能是我尝试使用 http 而不是 https 连接的事实吗?
【问题讨论】:
【参考方案1】:由于您使用 http 调用,您必须将 android:usesCleartextTraffic="true"
添加到您的清单并检查 Internet 权限
permission <uses-permission android:name="android.permission.INTERNET"/>
【讨论】:
【参考方案2】:首先,使用以下命令通过终端窗口启动 localhost 服务器。 -> 节点索引.js
然后运行您的应用程序。
【讨论】:
【参考方案3】:从终端使用 aws 的命令
amplify env pull --restore
然后
amplify push // this command plays the role to remove Network exception
【讨论】:
【参考方案4】:首先,确保将INTERNET
权限添加到AndroidManifext.xml
,在<application
块上方
<uses-permission android:name="android.permission.INTERNET"/>
如果还是不行,试试Build -> Clean Project
。
如果还是不行,请卸载设备上的应用,然后重新安装
【讨论】:
删除并重新安装应用程序对我有用,非常感谢 Gibolt。【参考方案5】:所以几天前我取得了一些进展,我一直在环顾四周并尝试不同的事情,以确保这不是侥幸或任何事情。这对其他人来说可能很明显,但显然您需要确保运行应用程序的设备连接到托管 GraphQL 服务器的同一网络。如果它们不在同一个网络上,那么 GraphQL 服务器甚至不会收到查询,并且应用程序会发送上述描述性错误。
奇怪的是,即使设备连接到同一个网络,有时我也会再次收到该错误。解决这个问题的唯一方法是断开我的计算机与网络的连接,甚至不得不忘记网络,然后重新连接。到目前为止,这样做对我有用。
现在我遇到了 422 错误,这是我正在尝试解决的另一个问题。
【讨论】:
以上是关于Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)的主要内容,如果未能解决你的问题,请参考以下文章
通过 apollo 连接到 graphql-yoga 服务器进行订阅的正确方法是啥?
将 Strapi 连接到 NextJS/Apollo 客户端 GraphQL - 未提供所需类型“XXX”的变量“$input”
如何使用另一种编程语言连接到 apollo graphql-websocket?