参考:https://blog.csdn.net/feiyingwang/article/details/113945807
GraphQL是什么?
GraphQL官方解释是一个用于API的查询语言,前端用户自己灵活且随意地选择传入的参数和返回的字段。
简介
GraphQL是用于描述复杂数据模型的一种查询语言,简单来说就是需要什么字段就能够拿到什么字段,返回给前端的数据没有冗余,并且返回的数据类型是json格式的。
官网解释:GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。 GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,而且没有任何冗余,也让 API 更容易地随着时间推移而演进,还能用于构建强大的开发者工具。
GraphQL主要是作用于数据接口,比如前端后端交互。是给客户端筛选自由获取服务端事先定义好的数据,后端使用了GraphQL之后,数据库查出来A,B,C,D四个字段,客户端需要数据的时候,你可以随意使用这四个字段的各种组合,只要A,C字段还是只要A,C,D字段等等,不再需要和服务端交流。
那么,可不可以前端去控制需要的字段?
答案是可以的,GraphQL为此而生。下面的代码块是一个graphQL查询语句,当我们只需要account的id和name时这样写查询就可以了,如果需要avatar,我们再加上avatar就可以了。
{
account {
id
name
}
}
这样对比restFulAPI而言,graphQL更加灵活,能够准确获取想要的数据。
结论:查询语句放在前端,由前端来控制需要的数据,所以是用于API的查询语言。
使用
参考:https://blog.csdn.net/y368769/article/details/111152157
万年第一步:导jar包
<dependency>
<groupId>io.leangen.graphql</groupId>
<artifactId>spqr</artifactId>
<version>0.10.1</version>
</dependency>
controller层配置
@Autowired
TestService testService;//service层
static GraphQLSchema schema = null;
public GraphQLSchema init() {
if (schema != null) {
return schema;
}
schema = new GraphQLSchemaGenerator()
.withBasePackages("io.leangen")//这里不用改
.withOperationsFromSingleton(testService)
.generate();
return schema;
}
@PostMapping("/graphQL")
public Object getGateway(@RequestBody String sql) {
init();
GraphQL graphQL = new GraphQL.Builder(schema).build();
ExecutionResult result = graphQL.execute(sql);
return result;
}
在这里需注意使用的是@RequestBody
service层
注意:
使用注解:@GraphQLQuery,
里面的name元素是请求时候的字段,
可以在后面操作对比看到
传参:
单独一个字段可使用:@GraphQLArgument;
对象可使用:@GraphQLContext
仔细看的话getDeviceBySubGateway方法传递的参数是subGateway方法返回的对象,这里就设计到了它的传参机制,内层方法使用的参数是外层方法返回的参数,这样说很是模糊,在后面的实际操作中就可以看到
@Autowired
TestMapper testMapper;//mapper和普通的一样专门查询数据库的
@GraphQLQuery(name = "subgateway")
public SubGateway subGateway(@GraphQLArgument(name = "extsno") String id) {
if (Strings.isBlank(extsno)) {
return null;
}
List<SubGateway> subGateways = tIotGatewaysMapper.findByExtsno(extsno);
return subGateways.get(0);
}
@GraphQLQuery(name = "gateway")
public Gateway getDeviceBySubGateway(@GraphQLContext SubGateway subGateway) {
List<Gateway> devices = tIotGatewaysMapper.findGatewayBySub(subGateway);
return devices.get(0);
}
bean
这里需要注意
使用到的所有bean必须统一继承一个类才能使用
在有可能前台访问的字段上添加注解:@GraphQLQuery
SubGateway:
@Data
public class SubGateway extends CommonModel {
/**
* SNO 机器码
*/
@GraphQLQuery(name = "sno", description = "机器码")
private String sno;
/**
* 内网IP
*/
@GraphQLQuery(name = "ip", description = "IP")
private String ip;
/**
* contrl_device_api_port 外网控制端口
*/
@GraphQLQuery(name = "port", description = "端口")
private String port;
/**
* contrl_device_api_uri 外网控制接口
*/
//@GraphQLQuery(name = "api", description = "外网控制接口")
private String api;
/**
* SNO 生成机器码
*/
@GraphQLQuery(name = "ext_sno", description = "生成机器码")
private String extSno;
/**
* gwid
*/
@GraphQLQuery(name = "gateway_id", description = "生成机器码")
private String gwid;
}
CommonModel
@Data
public abstract class CommonModel {
@GraphQLQuery
private String id;
@GraphQLQuery(name = "status",description = "状态")
protected String status="true";
@GraphQLQuery(name = "isdel",description = "是否删除")
protected String delFlag="false";
protected String createBy;
}
@Data
public class Gateway extends CommonModel {
/**
* SNO 机器码
*/
@GraphQLQuery(name = "sno", description = "机器码")
private String sno;
/**
* GIT 地址
*/
@GraphQLQuery(name = "git_path", description = "项目地址")
private String gitPath;
/**
* 描述
*/
@GraphQLQuery(name = "desription", description = "描述")
private String desription;
private String subid;
操作
可以去下载关于使用的demo:
https://github.com/yanshuoshi/graphol