改造到 GraphQL
Posted
技术标签:
【中文标题】改造到 GraphQL【英文标题】:Retrofit to GraphQL 【发布时间】:2021-10-20 17:35:30 【问题描述】:我有一个 android 应用程序,它将通过 AWS Appsync
使用来自 GraphQL API 的数据。我知道大多数资源都指向 Apollo
作为要使用的客户端库,但由于我们的 CICD,生成模型并不完全可能,或者我没有在 CICD/Apollo/Android 上找到好的示例/文档。解决方法是使用Retrofit
创建一个常规的POST
请求。无论我尝试什么,除了 400 之外,我似乎什么也得不到。我已经使用curl
和NodeJS
成功调用了API。我对 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
,我应该使用来自(Gson)的JsonObject
。由于我使用的是GsonConverterFactory
,所以在使用JSONObject
创建器时会出现奇怪的值。希望这可以帮助某人。同样使用 Gson,序列化对象时应该使用的默认类是 JsonObject
。
【讨论】:
以上是关于改造到 GraphQL的主要内容,如果未能解决你的问题,请参考以下文章