Модернизация до GraphQL

#java #android #graphql #retrofit2 #aws-appsync

Вопрос:

У меня есть приложение для Android, которое будет использовать данные из API GraphQL через AWS Appsync . Я знаю, что большинство ресурсов указывают на Apollo использование клиентской библиотеки, но из-за нашего CICD создание моделей не совсем возможно, или я не нашел хороших примеров/документации по CICD/Apollo/Android. Обходной путь состоял в том, чтобы создать регулярный POST запрос с Retrofit помощью . Независимо от того, что я пытаюсь, я, похоже, не могу получить ничего, кроме 400 возвращенных. Я успешно вызвал API с curl помощью и NodeJS . Я довольно новичок в Android, поэтому любые рекомендации приветствуются.

подход с завитками (успех):

 curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:[SOME_API_KEY]" -d '{ "query": "query { listData { dataName } }" }' https://amazon.endpoint.com/graphql
 

Узловой подход (успех):

 async function testApi() {
    const headers = {
        'x-api-key': 'SOME_API_KEY',
        'Content-Type': 'application/graphql'
    }

    const options = {
        headers
      };

    try {
        const b = await axios.post('https://amazon.endpoint.com/graphql',
        { "query": "query { listData { dataName } }" },options)
        console.log(b.data)
    } catch (error) {
        console.log(error)
    }
}

testApi();
 

Подход Android (сбой):

 // class to create
public interface GraphqlService {
    @Headers({
            "Content-Type: application/graphql",
            "x-api-key: SOME_API_KEY"
    })
    @POST("/graphql")
    Call<String> getLockers(@Body String body);
}
 
 // in main code
retrofit = new Retrofit.Builder()
        .baseUrl("https://amazon.endpoint.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
GraphqlService service = retrofit.create(GraphqlService.class);

try {
    JSONObject paramObject = new JSONObject();
    String query = "query { listData { dataName } }";
    paramObject.put("query", query);
    service.getLockers(paramObject.toString())
            .enqueue(new Callback<String>() {

                @Override
                public void onResponse(Call<String> call, Response<String> response) {
                    System.out.println(response);
                }

                @Override
                public void onFailure(Call<String> call, Throwable t) {
                    System.out.println(t);
                }
            });
} catch (JSONException e) {
    e.printStackTrace();
}
 

Я думаю, что есть что-то забавное в том, как Gson преобразует объект? Я проверил, что запрос верен с помощью curl и Node . Еще раз я новичок в разработке Android и был бы признателен за любые мысли по этому поводу.

Ответ №1:

Я действительно нашел проблему. Это было с использованием объектов Gson. Вместо использования String я должен был использовать JsonObject from (Gson). Поскольку я использовал GsonConverterFactory , при использовании создателя появлялись странные значения JSONObject . Надеюсь, это кому-нибудь поможет. Также работает с Gson, класс по умолчанию, который следует использовать при сериализации объектов JsonObject .