Apollo客户端无法连接到GraphQL服务器(http调用执行失败)

时间:2019-08-01 21:31:23

标签: java android-studio graphql apollo-client graphql-java

我正在尝试建立一个简单的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连接的事实吗?

4 个答案:

答案 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

然后运行您的应用。