java 实现 Graph QL 接口调用

自https://blog.csdn.net/belalds/article/details/88527769转载,用于补充记录及备忘

在一次项目需要接入第三方平台,而引用Graph QL遇到了很多问题,特意进行记录

目前这个graphql client只支持post的graphql server

使用maven构建依赖关系
<dependency>
    <groupId>org.mountcloud</groupId>
    <artifactId>graphql-client</artifactId>
    <version>1.1</version>
</dependency>
 
用例
//graphql服务器地址
String serverUrl = "http://localhost:8080/graphql";
//build一个新的graphqlclient
GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);
 //如果说graphql需要健全信息我们可以用map来进行传递
Map<String,String> httpHeaders = new HashMap<>();
httpHeaders.put("content-type", "application/json");
httpHeaders.put("cache-control", "no-cache");
httpHeaders.put("authorization", "Bearer "+accessToken);
//设置http请求的头
graphqlClient.setHttpHeaders(httpHeaders);
//发起一个简单的query查询
//创建一个Query并设置query的名字为findUser,该名字也就是你要访问的第三方功能
//如果有特殊需要可以自己继承GraphqlQuery,DefaultGraphqlQuery已经可以满足所有请求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");
//我们需要查询user的名字,性别还有年龄,设置需要查询的这三个属性。
query.addResultAttributes("name","sex","age");
try {
    //执行query
    GraphqlResponse response = graphqlClient.doQuery(query);
    //获取数据,数据为map类型
    Map result = response.getData();
} catch (IOException e) {
    e.printStackTrace();
}

对应的graphql语句为:
query{
    findUser{
        name
        sex
        age
    }
}

设置复杂的查询结果

//创建一个Query并设置query的名字为findUser
//如果有特殊需要可以自己继承GraphqlQuery,DefaultGraphqlQuery已经可以满足所有请求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");
 
//------------------------------------------------------------------------
//查询名字为张三,年龄为23岁的人,这里的参数类型一定要与query的参数类型一致
query.addParameter("name","张三").addParameter("age",23);
 
//------------------------------------------------------------------------
//我们需要查询user的名字,性别还有年龄,设置需要查询的这三个属性。
query.addResultAttributes("name","sex","age");
 
//------------------------------------------------------------------------
//查询用户的部门
ResultAttributtes departmentAttr = new ResultAttributtes("department");
//查询部门的名字和编号
departmentAttr.addResultAttributes("name","code");
 
//查询部门所属的公司
ResultAttributtes companyAttr = new ResultAttributtes("company");
//查询部门所属公司的名字
companyAttr.addResultAttributes("name");
 
//将部门和公司两者关联起来
departmentAttr.addResultAttributes(companyAttr);
 
//将需要查询的这个语句放到query里
query.addResultAttributes(departmentAttr);
 
//------------------------------------------------------------------------
try {
    //执行query
    GraphqlResponse response = graphqlClient.doQuery(query);
    //获取数据,数据为map类型
    Map result = response.getData();
} catch (IOException e) {
    e.printStackTrace();
}
对应的graphql语句为:

query{
    findUser(name:"张三",age:23){
        name
        sex
        age
        department{
            name
            code
            company{
                name
            }
        }
    }
}

// 涉及修改的部分暂时未使用,仅记录
MUTATION
这里只写一个复杂的mutaion,其实跟query一样

//创建一个mutation并设置名字为updateUser
GraphqlMutation mutation = new DefaultGraphqlMutation("updateUser");
 
//设置参数,用户id为12,名字为张三,年龄为24
mutation.addParameter("id",12).addParameter("name","张三").addParameter("age",24);
 
//获取修改的结果
mutation.addResultAttributes("code");
 
//获取结果里的数据:data对象昂
ResultAttributtes dataAttr = new ResultAttributtes("data");
//获取data里的消息、修改执行状态与时间戳
dataAttr.addResultAttributes("message","state","date");
 
//将data与mutation关联起来
mutation.addResultAttributes(dataAttr);
 
//执行mutation
try {
    GraphqlResponse mutationResponse = graphqlClient.doMutation(mutation);
    //同样返回的数据也是map的
    Map mutationResult = mutationResponse.getData();
} catch (IOException e) {
    e.printStackTrace();
}


遇到的问题
1、由于是对接第三方平台,所以平台给出的范例都是假的,坑死个人


这种的就是identity不存在的

2、由于输出的数据是map,在获取到数组时,并不能通过Json 转实体的方式实现,使用采用了字符串截取的方式进行了构造实体,暂时没有好的办法,以后有空记得回来再改了

 

posted @ 2021-05-27 19:21  外向孤独症_Xwb  阅读(1913)  评论(0编辑  收藏  举报