本质上,客户端需要显示特定user
的此Report视图。目前,当客户端登录此页面时,他们必须拨打多个网络电话(50-100)才能获得在报告中显示所需的数据。
作为一种解决方案,我希望设计一个单一的REST API端点,该端点依赖于负责查询多个表和复杂联接的单一Query对象来发送JSON对象作为响应,这样客户端就不必进行多次网络调用。
关于如何设计此工作流,有什么建议吗?
REST API将是处理多个请求的更好选择。设计api以期望查询参数中的请求数据具有所需的筛选器和检查。如果您在当前状态下进行50-100次调用,那么API需要与多个表交互,如果数据巨大,那么用户体验可能会受到影响,因为页面加载可能会延迟。
用我可以建议的两种可能的方式之一来完善这个API:
- 设计加载用户登录页所需的数据,并使用任何调度程序服务准备好这些数据,这样可以最大限度地减少实时执行的查询,如果数据不是实时的,则使用缓存来解决此问题
- 如果你的页面设计负担得起,实现延迟加载以获得更好的体验
我建议这样做:
- 在客户端构建一个带有参数的JSON对象字符串,并对其进行url编码
- 使用参数的对象字符串作为查询字符串调用您的URL(HTTP/GET)
https://your-baseurl/your-endpoint?p={...}
- 在服务器端解析查询字符串
- 连接到Postgresql
- 准备并运行复杂的参数化SQL查询,该查询返回JSON(可能是键值对对象的JSON数组),参数值取自解析的查询字符串。关于SO如何做到这一点,有很多例子
- 为了防止SQLi,请不要使用SQL文本替换,只准备语句
- 将查询结果放入响应中
Postgresql将在一个查询中完成所有繁重的工作——无论多么复杂——没有任何数据编组。
因此,API将是HTTP/GET,带有一个JSON参数,响应Content-Type: application/json
表示一个键-值对数组。成功/失败-通过HTTP响应状态代码200或40X。