改造到 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 之外,我似乎什么也得不到。我已经使用curlNodeJS 成功调用了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 转换对象的方式有什么有趣的地方吗?我已经通过curlNode 验证了查询是正确的。再次,我是 Android 开发的新手,如果对此有任何想法,我将不胜感激。

【问题讨论】:

【参考方案1】:

我确实发现了这个问题。这是使用 Gson 对象。而不是使用String,我应该使用来自(Gson)的JsonObject。由于我使用的是GsonConverterFactory,所以在使用JSONObject 创建器时会出现奇怪的值。希望这可以帮助某人。同样使用 Gson,序列化对象时应该使用的默认类是 JsonObject

【讨论】:

以上是关于改造到 GraphQL的主要内容,如果未能解决你的问题,请参考以下文章

分分钟将 REST 转换为 GraphQL

将改造数组数据插入到 sqlite

改造到 GraphQL

CAS进行https到http的改造方案

如何从android改造上传图像到服务器

安卓改造 |发布自定义对象(将 json 发送到服务器)