#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
.