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

ski*_*130 5 java android-studio graphql apollo-client graphql-java

我正在尝试设置一个简单的 Android 应用程序,该应用程序通过使用 Java GraphQL 的 Springboot 应用程序连接到我本地主机上设置的 GraphQL 服务器。使用 GraphiQL 我可以很好地查询。问题是当我尝试使用 Apollo Client 在我的应用程序中进行相同的查询时,我收到以下错误

 

“com.apollographql.apollo.exception.ApolloNetworkException:无法执行http调用”

 

我使用本教程通过 Springboot 设置 GraphQL 服务器并定义 GraphQL 模式。我依靠本教程来帮助设置应用程序。

早些时候我曾尝试通过我的网络浏览器访问服务器,但我会收到一条错误消息

 

“出现意外错误(类型=错误请求,状态=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
Run Code Online (Sandbox Code Playgroud)

 

这是 graphQL 查询文件。

query BookById($id : ID) {
    Book: bookById(id : $id){
      name
      author{
        firstName
        lastName
      }
}}
Run Code Online (Sandbox Code Playgroud)

 

所以在这一点上我有点不知所措。有没有办法使用 POST 而不是 GET 请求通过 Apollo Client 发送我的查询?或者让 GraphQL 服务器接受 GET 请求是否更好,并且可能?

我只是很困惑为什么 ApolloClient 总是无法进行 http 调用,不幸的是该错误不是很具有描述性,所以我有点困惑。

老实说,我认为 GET 请求会工作得很好,甚至是首选,因为我只是请求返回数据而不是尝试添加任何内容。我感谢你们能提供的任何帮助,并提前致谢!

e:讨论一下,问题可能是我尝试使用 http 而不是 https 连接吗?

ski*_*130 0

所以几天前我取得了一些进展,我一直在四处寻找并尝试不同的事情,以确保这不是侥幸或其他什么。这对其他人来说可能是显而易见的,但显然您需要确保运行应用程序的设备连接到托管 GraphQL 服务器的同一网络。如果它们不在同一网络上,那么 GraphQL 服务器甚至永远不会收到查询,并且应用程序会发送上述描述性错误。

奇怪的是,即使设备连接到同一网络,我有时也会再次遇到该错误。解决这个问题的唯一方法就是断开我的计算机与网络的连接,甚至必须忘记网络,然后重新连接。到目前为止,这样做对我来说很有效。

现在我遇到了 422 错误,这是我正在尝试解决的另一个问题。