REST API设计:动态SQL查询结果的GET接口实现及消费方案
动态SQL查询API的设计与消费方案
服务端API设计
统一返回结构,包裹动态结果
不管执行何种SQL查询,都返回包含固定字段的JSON结构,把动态结果拆分为元数据和数据集两部分:{ "success": true, "metadata": [ {"fieldName": "id", "dataType": "int"}, {"fieldName": "username", "dataType": "varchar"}, {"fieldName": "department", "dataType": "varchar"} ], "data": [ {"id": 1, "username": "tom", "department": "dev"}, {"id": 2, "username": "jerry", "department": "ops"} ], "message": "" }metadata用来描述结果字段的名称和数据类型,给客户端提供渲染依据data存储实际的查询结果行success和message用来反馈执行状态,比如SQL错误时返回具体提示
强化安全防护
即便仅限管理员访问,也要做风险控制:- 拦截
DROP、ALTER、TRUNCATE这类高危语句,仅允许SELECT(如果只需要查询能力)或限定可执行的SQL类型 - 设置SQL执行超时时间,避免长查询拖垮数据库
- 记录所有执行的SQL语句,留痕用于审计
- 拦截
遵循REST规范区分操作类型
GET接口仅用于查询操作,如果需要支持数据修改类SQL(如INSERT/UPDATE),改用POST/PUT/DELETE请求,避免浏览器缓存或误触发的问题。比如用POST提交SQL语句,服务端执行后返回对应结果:查询返回结果集,修改操作返回影响行数。
客户端消费方案
动态渲染结果表格
基于服务端返回的metadata生成表头,再遍历data生成表格内容。以Vue为例:<table> <thead> <tr> <th v-for="col in metadata" :key="col.fieldName">{{ col.fieldName }}</th> </tr> </thead> <tbody> <tr v-for="row in data" :key="row.id || Math.random()"> <td v-for="col in metadata" :key="col.fieldName">{{ formatValue(row[col.fieldName], col.dataType) }}</td> </tr> </tbody> </table>按数据类型格式化显示
根据metadata里的dataType做对应处理:比如日期类型转成YYYY-MM-DD格式,数字类型添加千分位分隔,布尔值显示为“是/否”或开关样式。状态与错误提示
先判断success字段:如果执行失败,直接把message显示给用户(比如“SQL语法错误”“无权限执行该语句”);执行成功时,可额外提示“查询完成,共X条数据”这类辅助信息。
内容的提问来源于stack exchange,提问作者Tomtom
相关产品推荐
相关产品推荐

