我正在尝试建立一个简单的Android应用程序,该应用程序使用Java GraphQL通过Springboot应用程序连接到本地主机上设置的GraphQL服务器。使用GraphiQL我可以很好地查询。问题是,当我尝试使用Apollo Client在应用程序中进行相同的查询时,出现以下错误
“ com.apollographql.apollo.exception.ApolloNetworkException:无法执行http调用”
我使用this tutorial通过Springboot设置GraphQL服务器并定义了GraphQL模式。而且我依靠this tutorial来帮助设置应用程序。
之前,我曾尝试通过Web浏览器访问服务器,但会出现错误消息
“发生意外错误(类型=错误的请求,状态= 400)。 必需的字符串参数'query'不存在”
因此,我尝试了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连接的事实吗?
答案 0 :(得分:0)
所以几天前,我取得了一些进展,并且一直在四处寻找各种尝试,以确保这不是a幸之类。这对其他人可能很明显,但是显然您需要确保运行该应用程序的设备已连接到托管GraphQL服务器的同一网络。如果它们不在同一网络上,则GraphQL服务器甚至都不会收到查询,并且该应用会发送上述描述性错误。
奇怪的是,即使设备连接到同一网络,有时我也会再次出现该错误。解决此问题的唯一方法是断开计算机与网络的连接,甚至不得不忘记网络,然后重新连接。到目前为止,这样做对我有用。
现在,我陷入了422错误,这是我要解决的另一个问题。
答案 1 :(得分:0)
首先,请确保在INTERNET
块上方向AndroidManifext.xml
添加<application
权限
<uses-permission android:name="android.permission.INTERNET"/>
如果仍不能解决问题,请尝试Build -> Clean Project
。
如果仍然不起作用,请在设备上卸载应用程序 ,然后重新安装
答案 2 :(得分:0)
使用来自终端的AWS命令
amplify env pull --restore
然后
amplify push // this command plays the role to remove Network exception
答案 3 :(得分:0)
首先,使用以下命令通过终端窗口启动本地主机服务器。 ->节点index.js
然后运行您的应用。