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; } }
|
对比官网示例,步骤就清晰明了了。