Java对接GraphQL

GraphQL的逻辑如果在java实现感觉还是很复杂,因为其相当于一种组排的策略模式。好在不需要进行相应的实现,只需要调用别人的接口即可。

但java调用GraphQL接口的成熟客户端好像就只有一个,当我们去maven中央仓库寻找客户端依赖时发现好像就只有这一个客户端

进入该依赖库发现GitHub地址:GitHub - graphql-java/graphql-java: GraphQL Java implementation

我们找到官方文档,可以看到结构确实复杂,学习成本很高。

所以没必要浪费太多时间。我随后找到了私人开源作品:

pom:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| <!-- https://mvnrepository.com/artifact/org.mountcloud/graphql-client --> <dependency> <groupId>org.mountcloud</groupId> <artifactId>graphql-client</artifactId> <version>1.2</version> </dependency> |

同理 我们去maven仓库寻找GitHub开源地址:GitHub - MountCloud/graphql-client: graphql client for java

发现给的例子很少但是简洁明了也符合我们需求。

所以,java对GraphQL的请求都模仿自这里,我直接把文档的内容搬过来然后做个对比:

复制代码
do query

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //crate client GraphqlClient client = GraphqlClient.buildGraphqlClient("http://localhost:8081/graphql"); //create http headers Map<String,String> headers = new HashMap<String,String>(); headers.put("token","123"); client.setHttpHeaders(headers); //create query GraphqlQuery query = new DefaultGraphqlQuery("findUsers"); //add query or mutation param query.addParameter("sex","man").addParameter("age",11); //add query response basics attribute query.addResultAttributes("id","name","age","sex"); //add query complex attributes ResultAttributtes classAttributte = new ResultAttributtes("class"); classAttributte.addResultAttributes("name","code"); //attributes can be more complex ResultAttributtes schoolAttributte = new ResultAttributtes("school"); schoolAttributte.addResultAttributes("name"); //class add school attribute classAttributte.addResultAttributes(schoolAttributte); //do query try { GraphqlResponse response = client.doQuery(query); //this map is graphql result Map data = response.getData(); } catch (IOException e) { e.printStackTrace(); } query is query{ findUsers(sex:"man",age:11){ id name age sex class{ name code school{ name } } } } |

复制代码
do mutation

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| //crate client GraphqlClient client = GraphqlClient.buildGraphqlClient("http://localhost:8081/graphql"); //create http headers Map<String,String> headers = new HashMap<String,String>(); headers.put("token","123"); client.setHttpHeaders(headers); //create mutaion GraphqlMutation mutation = new DefaultGraphqlMutation("updateUser"); //create param mutation.addParameter("id",1).addParameter("name","123").addParameter("age",18); //add more complex attribute to see do query demo //result mutation.addResultAttributes("code"); try { GraphqlResponse response = client.doMutation(mutation); //this map is graphql result Map data = response.getData(); } catch (IOException e) { e.printStackTrace(); } mutation is mutation{ updateUser(id:1,name:"123",age:18){ code } } |

复制代码
Complex structure request demo
复制代码
Mutation demo,The query is consistent with the 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 is

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

以上就是官方全部案例,即使你去百度得到的也不过是这些。

从案例中可以看出,请求有两种,一种是简单请求query,一种是复杂请求mutation。

要记住GraphQL的核心就是查询请求,无外乎封装条件。

所以GraphQL的查询请求很简单:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @PostMapping("/find") // @RequestMapping(method = RequestMethod.POST, value = "/find") public Result find() { //1、graphql服务地址 String serverUrl = "https://api2.vetspire.com/graphql"; //2、build一个新的graphqlClient GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl); //3、使用Map来存储放入请求头,Authorization的密钥 Map<String, String> httpHeaders = new HashMap<>(); httpHeaders.put("Authorization", "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAAIMTIxOjUxNDdkAAZzaWduZWRuBgA2HeSibwE.FSigojcmpREK5InTRp1iaxg_S2QQnz_Vd5_Z_PIlRQc"); //4、graphqlClient 设置http请求的头 graphqlClient.setHttpHeaders(httpHeaders); //下面开始发一个简单的query请求查询 //创建一个query并设置query的名字为org,如果有特殊的需求自己继承GraphqlQuery String queryMethodName = "org"; GraphqlQuery query = new DefaultGraphqlQuery(queryMethodName); // 如果需要增加一些必要的参数则使用query.addParameter(""): //设置需要查询的参数是id和name query.addResultAttributes("id", "name"); //通过上面的信息进行查询 GraphqlResponse response = null; try { response = graphqlClient.doQuery(query); } catch (IOException e) { e.printStackTrace(); } //获取数据,数据为map类型 Map result = response.getData(); System.out.println(result); System.out.println(result.get("data")); return new Result(true, StatusCode.SUCCESS.getCode(),result); } |

复杂一点的是更新的请求,需要组装条件模仿GraphQL的格式,还要封装相应的实体类:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| @GetMapping("/updatePatient") public Result updatePatient() throws IOException { //1、graphql服务地址 String serverUrl = "https://api2.vetspire.com/graphql"; //2、build一个新的graphqlClient GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl); //3、使用Map来存储放入请求头,Authorization的密钥 Map<String, String> httpHeaders = new HashMap<>(); httpHeaders.put("Authorization", "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAAIMTIxOjUxNDdkAAZzaWduZWRuBgA2HeSibwE.FSigojcmpREK5InTRp1iaxg_S2QQnz_Vd5_Z_PIlRQc"); //4、graphqlClient 设置http请求的头 graphqlClient.setHttpHeaders(httpHeaders); GraphqlMutation mutation = new DefaultGraphqlMutation("updatePatient"); //Patient patient = new Patient(24,"red"); Patient input = new Patient(24,"blue"); mutation.addParameter("id",847568).addObjectParameter("input",input); mutation.addResultAttributes("id","name","birthDate","color","species","clientId","updatedAt","insertedAt","breed"); //addObjectParameter("patient",patient); ResultAttributtes dataAttr = new ResultAttributtes("latestWeight"); mutation.addResultAttributes(dataAttr); GraphqlResponse mutationResponse = graphqlClient.doMutation(mutation); //同样返回的数据也是map的 Map result = mutationResponse.getData(); System.out.println(result); System.out.println(result.get("data")); return null; } class Patient{ public Integer getBirthDay() { return birthDay; } public void setBirthDay(Integer birthDay) { this.birthDay = birthDay; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } private Integer birthDay; private String color; private String breed; private String sex; public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getSpecies() { return species; } public void setSpecies(String species) { this.species = species; } private String species; public Patient(Integer birthDay,String color){ this.birthDay = birthDay; this.color = color; } } |

对比官网示例,步骤就清晰明了了。

相关推荐
躺平大鹅37 分钟前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者1 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart3 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP4 小时前
MyBatis-mybatis入门与增删改查
java
孟陬7 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌7 小时前
一站式了解四种限流算法
java·后端·go
华仔啊8 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝9 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java