java使用graphql client

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhanghaishan/article/details/79845594

在项目中引用graphql client

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

使用maven构建依赖关系

<dependency>
  <groupId>org.mountcloud</groupId>
  <artifactId>graphql-client</artifactId>
  <version>1.2</version>
</dependency>

项目地址:GitHub

更新 1.2 日志

请求的参数支持自定义复杂类型和Enum类型。

用例

QUERY

构建graphql client

//graphql服务器地址
String serverUrl = "http://localhost:8080/graphql";
//build一个新的graphqlclient
GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);

//如果说graphql需要健全信息我们可以用map来进行传递
Map<String,String> httpHeaders = new HashMap<>();
httpHeaders.put("token","graphqltesttoken");
//设置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();
}

如何实现一个复杂请求

用Mutation做演示,query与mutation原理一样.

    @Test
    public void testObjectParameter() throws IOException {


        
        String serverUrl = "http://localhost:8080/graphql";
        
        GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);

        
        Map<String,String> httpHeaders = new HashMap<>();
        httpHeaders.put("token","graphqltesttoken");
        
        graphqlClient.setHttpHeaders(httpHeaders);

        GraphqlMutation mutation = new DefaultGraphqlMutation("addUser");

        List<User> users = new ArrayList<>();
        users.add(new User("tim",SexEnum.M));
        users.add(new User("sdf",SexEnum.F));
        mutation.getRequestParameter().addParameter("classId","123").addObjectParameter("users",users);

        mutation.addResultAttributes("code");

        System.out.println(mutation.toString());

    }

    /**
     * test user
     */
    class User{
        public User(String name, SexEnum sexEnum) {
            this.name = name;
            this.sexEnum = sexEnum;
        }

        private String name;
        private SexEnum sexEnum;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public SexEnum getSexEnum() {
            return sexEnum;
        }

        public void setSexEnum(SexEnum sexEnum) {
            this.sexEnum = sexEnum;
        }
    }

    /**
     * test user sex
     */
    enum SexEnum{
        M,
        F
    }

对应的mutation语句:

mutation{
  addUser(classId:"123",users:[{name:"tim",sexEnum:M},{name:"sdf",sexEnum:F}]){
    code
  }
}

欢迎评论留言讨论。

猜你喜欢

转载自blog.csdn.net/zhanghaishan/article/details/79845594