Git Product home page Git Product logo

tencent / apijson Goto Github PK

View Code? Open in Web Editor NEW
16.5K 382.0 2.1K 70.94 MB

🏆 零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构。 🏆 A JSON Transmission Protocol and an ORM Library 🚀 provides APIs and Docs without writing any code.

Home Page: http://apijson.cn

License: Other

Java 100.00%
postgresql-database tidb sqlserver oracle clickhouse postgresql hive hadoop tdengine low-code

apijson's Introduction

Tencent is pleased to support the open source community by making APIJSON available.
Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
This source code is licensed under the Apache License Version 2.0

APIJSON

🏆 零代码、全功能、强安全 ORM 库 🚀
后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构

English  通用文档 视频教程 测试用例

   

     

   

   


导航目录: 项目简介 上手使用 社区生态      完整详细的导航目录 点这里查看

APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。
为各种增删改查提供了完全自动化的万能通用接口,零代码实时满足千变万化的各种新增和变更需求。
能大幅降低开发和沟通成本,简化开发流程,缩短开发周期。
适合中小型前后端分离的项目,尤其是 创业项目、内部项目、低代码/零代码、小程序、BaaS、Serverless 等。

通过万能通用接口,前端可以定制任何数据、任何结构。
大部分 HTTP 请求后端再也不用写接口了,更不用写文档了。
前端再也不用和后端沟通接口或文档问题了。再也不会被文档各种错误坑了。
后端再也不用为了兼容旧接口写新版接口和文档了。再也不会被前端随时随地没完没了地烦了。

特点功能

对于后端

  • 提供万能通用接口,大部分 HTTP API 不用再写
  • 零代码增删改查、各种跨库连表、JOIN 嵌套子查询等
  • 自动生成文档,不用再编写和维护,且自动静态检查
  • 自动校验权限、自动管理版本、自动防 SQL 注入
  • 开放 HTTP API 无需划分版本,始终保持兼容

对于前端

  • 不用再向后端催接口、求文档
  • 数据和结构完全定制,要啥有啥
  • 看请求知结果,所求即所得
  • 可一次获取任何数据、任何结构
  • 能去除多余数据,节省流量提高速度

APIJSON 接口展示

Postman 展示 APIJSON


APIAuto 展示 APIJSON

使用 APIAuto-机器学习接口工具 来管理和测试 HTTP API 可大幅 减少传参错误、提升联调效率
(注意网页工具界面是 APIAuto,里面的 URL+JSON 才是 APIJSON 的 HTTP API):

APIJSON 多表关联查询、结构自由组合,APIAuto 多个测试账号、一键共享测试用例


APIAuto 自动生成前端(客户端)请求代码 和 Python 测试用例代码,一键下载


APIAuto 自动保存请求记录、自动生成接口文档,可添加常用请求、快捷查看一键恢复


APIAuto 一键自动接口回归测试,不需要写任何代码(注解、注释等全都不要)


一图胜千言 - APIJSON 部分基础功能概览



APIJSON App 演示

使用 APIJSON + ZBLibrary 开发的 Android 客户端 Demo (以下 Gif 图看起来比较卡,实际上运行很流畅):


APIJSON 分享演讲

APIJSON-零代码接口与文档 ORM 库(国际开源谷 Gitee Meetup)

https://www.bilibili.com/video/BV1Tv411t74v

image

APIJSON 和 APIAuto-零代码开发和测试(QECon 全球软件质量&效能大会)

https://www.bilibili.com/video/BV1yv411p7Y4

wecom-temp-377bbd0daf5aed716baf7ebcb003d94c


为什么选择 APIJSON?

前后端 关于接口的 开发、文档、联调 等 10 大痛点解析
https://github.com/Tencent/APIJSON/wiki

  • 解决十大痛点 (可帮前后端开发大幅提振开发效率、强力杜绝联调扯皮、巧妙规避文档缺陷、非常节省流量带宽)
  • 开发提速很大 (CRUD 零代码热更新全自动,APIJSONBoot 对比 SSM、SSH 等保守估计可提速 20 倍以上)
  • 腾讯官方开源 (使用 GitHub、Gitee、工蜂 等平台的官方账号开源,微信公众号、腾讯云+社区 等官方公告)
  • 社区影响力大 (GitHub 16K+ Star 在 400W Java 项目排名前 100,远超 FLAG, BAT 等国内外绝大部分开源项目)
  • 各项荣誉成就 (腾讯内外 5 个奖项、腾讯开源前八、腾讯后端 Star 第一、GitHub Java 日周月榜大满贯 等)
  • 多样用户案例 (腾讯内有互娱、音乐、微信、云与智慧,外部有华为、华能、百度、快手、中兴、圆通、传音等)
  • 适用场景广泛 (社交聊天、阅读资讯、影音娱乐、办公学习 等各种 App、网站、小程序、公众号 等非金融类项目)
  • 周边生态丰富 (Android, iOS, Web 等各种 Demo、继承 JSON 的海量生态、零代码 接口测试 和 单元测试 工具等)
  • 文档视频齐全 (项目介绍、快速上手、安装部署 等后端、前端、客户端的 图文解说、视频教程、代码注释 等)
  • 功能丰富强大 (增删改查、分页排序、分组聚合、各种条件、各种 JOIN、各种子查询、跨库连表 等零代码实现)
  • 使用安全简单 (自动增删改查、自动生成文档、自动管理版本、自动控制权限、自动校验参数、自动防 SQL 注入)
  • 灵活定制业务 (在后端编写 远程函数,可以拿到 session、version、当前 JSON 对象 等,然后自定义处理)
  • 高质可靠代码 (代码严谨规范,商业分析软件源伞 Pinpoint 代码扫描报告平均每行代码 Bug 率低至 0.15%)
  • 兼容各种项目 (协议不限 HTTP,与其它库无冲突,对各类 Web 框架集成友好且提供 SpringBoot, JFinal 的示例)
  • 工程轻量小巧 (仅依赖 fastjson,Jar 仅 280KB,Java 文件仅 59 个共 13719 行代码,例如 APIJSONORM 4.3.1)
  • 多年持续迭代 (自 2016 年起已连续维护 7 年多,60+ 贡献者、90+ 发版、3000+ 提交,不断更新迭代中...)

按照一般互联网中小型项目情况可得出以下对比表格:

表数量 T 平均每表字段数 C SSMH 按快估计 APIJSONBoot 按慢估计 APIJSONBoot 提速倍数
1 3 179 min(约一上午) 11 min(约十分钟) 15.27
5 4 1935 min(约朝九晚六一周) 70 min(约一小时) 26.64
10 10 8550 min(大小周超半个月) 320 min(约一下午) 25.72
20 15 31900 min(约 996 两个月) 940 min(约上班两天) 32.94
50 20 176750 min(11117 超半年) 3100 min(约上班一周) 56.02

用户反馈

腾讯 IEG 数据产品开发组负责人 xinlin: “腾讯的 APIJSON 开源方案,它可以做到零代码生成接口和文档,并且整个生成过程是自动化。当企业有元数据的时候,马上就可以获得接口”

腾讯科技 后台开发高级工程师 雷大锤: “可以抽出时间来看apijson了,这个可以为T10做准备,也是业界很火的东西,可以提升个人影响力!”

腾讯 bodian520: “在调试GET、POST、PUT接口时遇到了一些问题,把个人的摸索经验分享一下,希望作者能梳理下文档,方便我们更好的接入”

华为 minshiwu: “demo工程,默认使用apijson-framework,可以做到无任何配置即可体验apijson的各种能力。”

字节跳动 qiujunlin: “初次见到这个项目,觉得太惊艳了,眼前一亮。给我的感受是,项目大大简化了开发流程,开发效率提升了很多倍。”

百度智慧城市研发 lpeng: “很兴奋的发现APIJSON很适合我们的一个开发场景,作为我们协议定义的一部分”

中兴 duyijiang: “感谢腾讯大大提供的框架,很好用”

#132 (comment)


常见问题

1.如何定制业务逻辑?

在后端编写 远程函数,可以拿到 session、version、当前 JSON 对象、参数名称 等,然后对查到的数据自定义处理
#101

2.如何控制权限?

在 Access 表配置校验规则,默认不允许访问,需要对 每张表、每种角色、每种操作 做相应的配置,粒度细分到行级
#12

3.如何校验参数?

在 Request 表配置校验规则 structure,提供 MUST、TYPE、VERIFY 等通用方法,可通过 远程函数 来完全自定义
https://github.com/Tencent/APIJSON/wiki#%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86

更多常见问题及提问前必看
#36

注意事项

请求参数 JSON 中表名、字段名、关键词及对应的值都是大小写敏感、逗号敏感、分号敏感、空格敏感、换行敏感,
大部分情况都不允许空格和换行,表名以大写字母开头,不要想当然,请严格按照 设计规范 来调用 API !
#181



导航目录: 项目简介 上手使用 社区生态      完整详细的导航目录 点这里查看

快速上手

1.后端上手

可以跳过这个步骤,直接用APIJSON服务器IP地址 apijson.cn:8080 来测试接口。
见  APIJSON后端上手 - Java

2.前端上手

可以跳过这个步骤,直接使用 APIAuto-机器学习HTTP接口工具 或 下载客户端App。
见  Android  或  iOS  或  JavaScript

下载客户端 App

仿微信朋友圈动态实战项目
APIJSONApp.apk

测试及自动生成代码工具
APIJSONTest.apk

开源许可

使用 Apache License 2.0,对 公司、团队、个人 等 商用、非商用 都自由免费且非常友好,请放心使用和登记

使用登记

如果您在使用 APIJSON,请让我们知道,您的使用对我们非常重要(新的按登记顺序排列、专群优先答疑解惑):
#187




贡献者们

主项目 APIJSON 的贡献者们(6 个腾讯工程师、1 个微软工程师、1 个阿里云工程师、1 个字节跳动工程师、1 个网易工程师、1 个 Zoom 工程师、1 个圆通工程师、1 个知乎基础研发架构师、1 个智联招聘工程师、1 个美国加州大学学生、3 个 SUSTech 学生等):
https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md


生态周边项目的作者们(2 个腾讯工程师、1 个 BAT 技术专家、1 个微软工程师、2 个字节跳动工程师、1 个神州数码工程师&Apache dubbo2js 作者 等):
https://github.com/search?o=desc&q=apijson&s=stars&type=Repositories
https://search.gitee.com/?skin=rec&type=repository&q=apijson&sort=stars_count


还有为 APIJSON 扫描代码贡献 Issue 的 奇安信代码卫士源伞科技


感谢大家的贡献。

统计分析

腾讯、华为、阿里巴巴、美团、字节跳动、百度、京东、网易、快手等和 Google, Apple, Microsoft, Amazon, Paypal, IBM, Shopee 等
数百名知名大厂员工点了 Star,也有腾讯、华为、字节跳动、Microsoft、Zoom 等不少知名大厂员工提了 PR/Issue,感谢大家的支持~
Stargazers over time image image image

规划及路线图

新增功能、强化安全、提高性能、增强稳定、完善文档、丰富周边、推广使用
https://github.com/Tencent/APIJSON/blob/master/Roadmap.md

理论上所有支持 SQL 与 JDBC/ODBC 的软件,都可以用本项目对接 CRUD,待测试:
OceanBase, Spark(可用 Hive 对接), Phoenix(延伸支持 HBase)

我要赞赏

创作不易,坚持更难,右上角点 ⭐Star 来支持/收藏下吧,谢谢 ^_^
https://github.com/Tencent/APIJSON




导航目录: 项目简介 上手使用 社区生态      完整详细的导航目录 点这里查看

技术交流

如果有什么问题或建议可以 填问卷提 Issue,交流技术,分享经验。
如果你解决了某些 bug,或者新增了一些功能,欢迎 贡献代码,感激不尽~
https://github.com/Tencent/APIJSON/blob/master/CONTRIBUTING.md

开发者也是人,也需要工作、休息、恋爱、陪伴家人、走亲会友等,也有心情不好和身体病痛,
往往没有额外的时间精力顾及一些小问题,请理解和支持,开源要大家参与贡献才会更美好~
少数个人的热情终有被耗尽的一天,只有大家共同建设和繁荣社区,才能让开源可持续发展!

开发者时间精力有限,原则上优先解决 登记用户 和 贡献者 的问题,
不解决 文档/视频/常见问题 已明确说明、描述简陋 或 态度无礼 的问题!
如果你已经多次得到帮助,却仍然只索取不贡献,那就别指望大家再帮你!
私聊作者请教技术问题 或者 频繁在互助群 @ 作者 可能会被拉黑/禁言/踢群,请尊重和理解,谢谢!

如果你 提 PR 登记了自己使用 APIJSON 的公司,可以加 企业用户支持专群,作者亲自且优先答疑,
作者只有解答完了这个专群里的全部问题,才看情况解答 Issue/问卷 里的问题(对 Issue/问卷 不保证解答、更不保证及时);
之前的几个互助群,由于大多数问题 在文档/Issue 已有答案却反复提 或者 缺少必要信息要来来回回沟通问清细节 已浪费太多时间,
甚至有白嫖还把自己当大爷的自私自利伸手党输出情绪,我们不再支持,建议未登记企业的用户 填问卷提 Issue

如果你为 APIJSON 做出了以下任何一个贡献,我们将优先为你答疑解惑:
提交了 PR 且被合并提交了优质 Issue发表了优质文章开发了可用的生态项目
Issue/问卷 一般解答顺序:贡献者 > 帮助他人的用户 > 提供任职企业的用户 > 其他用户。

相关推荐

APIJSON, 让接口和文档见鬼去吧!

腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事

仿QQ空间和微信朋友圈,高解耦高复用高灵活

后端开挂:3行代码写出8个接口!

后端自动化版本管理,再也不用改URL了!

3步创建APIJSON后端新表及配置

APIJSON对接分布式HTAP数据库TiDB

APIJSON教程(一):上手apijson项目,学习apijson语法,并实现持久层配置

apijson简单demo

apijson简单使用

APIJSON简单部署和使用

学习自动化接口APIJSON

APIJSON 接口调试实践

关于APIJSON远程函数

APIJSON新增方法实例

APIJSON-APIJSON的那些事儿

APIJSON-零代码接口和文档 JSON 协议 与 ORM 库

APIJSON使用例子总结

APIJSON 自动化接口和文档的快速开发神器 (一)

APIJSON在mac电脑环境下配置去连接SQL Server

APIJSON复杂业务深入实践(类似12306订票系统)

全国行政区划数据抓取与处理

新手搭建 APIJSON 项目指北

使用APIJSON写低代码Crud接口

apijson在同一个接口调用中 使用远程函数写入更新时间和创建时间

APIJSON(一:综述)

APIJSON 代码分析(三:demo主体代码)

APIJSON 代码分析(二)AbstractParser类(解析器)

APIJSON 代码分析(四:AbstractObjectParser源码阅读)

APIJSON 代码分析 AbstractSQLConfig 第二篇

APIJSON 代码分析(六)APIJSON—Verifier检查类

APIJSON 代码分析(四)AbstractSQLExecutor—SQL执行器

APIJSON使用

apijson 初探

APIJSON使用介绍

MassCMS With APIJSON最佳实践

生态项目

APIJSON-Demo APIJSON 各种语言、各种框架 的 使用示例项目、上手文档、测试数据 SQL 文件 等

apijson-orm APIJSON ORM 库,可通过 Maven, Gradle 等远程依赖

apijson-framework APIJSON 服务端框架,通过数据库表配置角色权限、参数校验等,简化使用

apijson-router APIJSON 的路由插件,可控地对公网暴露类 RESTful 简单接口,内部转成 APIJSON 格式请求来执行

apijson-column APIJSON 的字段插件,支持 字段名映射 和 !key 反选字段

apijson-milvus APIJSON 的 Milvus AI 向量数据库插件

apijson-influxdb APIJSON 的 InfluxDB 物联网时序数据库插件

apijson-mongodb APIJSON 的 MongoDB NoSQL 数据库插件

apijson-cassandra APIJSON 的 Cassandra NoSQL 数据库插件

APIAuto 敏捷开发最强大易用的接口工具,机器学习零代码测试、生成代码与静态检查、生成文档与光标悬浮注释

UnitAuto 机器学习零代码单元测试平台,零代码、全方位、自动化 测试 方法/函数 的正确性、可用性和性能

SQLAuto 智能零代码自动化测试 SQL 语句执行结果的数据库工具,一键批量生成参数组合、快速构造大量测试数据

UIGO 📱 零代码快准稳 UI 智能录制回放平台 🚀 自动兼容任意宽高比分辨率屏幕、自动精准等待网络请求,录制回放快、准、稳!

apijson-doc APIJSON 官方文档,提供排版清晰、搜索方便的文档内容展示,包括设计规范、图文教程等

APIJSONdocs APIJSON 英文文档,提供排版清晰的文档内容展示,包括详细介绍、设计规范、使用方式等

apijson.org APIJSON 官方网站,提供 APIJSON 的 功能简介、登记用户、作者与贡献者、相关链接 等

APIJSON.NET C# 版 APIJSON ,支持 MySQL, PostgreSQL, SQL Server, Oracle, SQLite

apijson-go Go 版 APIJSON , 基于Go(>=1.18) + GoFrame2, 支持查询、单表增删改、权限管理等

apijson-go Go 版 APIJSON ,支持单表查询、数组查询、多表一对一关联查询、多表一对多关联查询 等

apijson-hyperf PHP 版 APIJSON,基于 Hyperf 支持 MySQL

APIJSON-php PHP 版 APIJSON,基于 ThinkPHP,支持 MySQL, PostgreSQL, SQL Server, Oracle 等

apijson-php PHP 版 APIJSON,基于 ThinkPHP,支持 MySQL, PostgreSQL, SQL Server, Oracle 等

apijson-node 字节跳动工程师开源的 Node.ts 版 APIJSON,提供 nestjs 和 typeorm 的 Demo 及后台管理

uliweb-apijson Python 版 APIJSON,支持 MySQL, PostgreSQL, SQL Server, Oracle, SQLite 等

APIJSONParser 第三方 APIJSON 解析器,将 JSON 动态解析成 SQL

FfApiJson 用 JSON 格式直接生成 SQL,借鉴 APIJSON 支持多数据源

APIJSON-ToDo-Demo 一个简单的 todo 示例项目,精简数据,简化上手流程,带自定义鉴权逻辑

apijson-learn APIJSON 学习笔记和源码解析

apijson-practice BAT 技术专家开源的 APIJSON 参数校验注解 Library 及相关 Demo

apijson-db2 微软工程师接入 IBM 数据库 DB2 的 APIJSON 使用 Demo

APIJSONDemo 字节跳动工程师接入 ClickHouse 的 APIJSON 使用 Demo

APIJSONDemo_ClickHouse APIJSON + SpringBoot 连接 ClickHouse 使用的 Demo

APIJSONBoot_Hive APIJSON + SpringBoot 连接 Hive 使用的 Demo

apijson-sample APIJSON 简单使用 Demo 及教程

apijson-examples APIJSON 的前端、业务后端、管理后端 Demo

apijson-ruoyi APIJSON 和 RuoYi 框架整合,实现零代码生成页面模板接口,在线维护 APIJSON 数据库配置等

light4j 整合 APIJSON 和微服务框架 light-4j 的 Demo,同时接入了 Redis

SpringServer1.2-APIJSON 智慧党建服务器端,提供 上传 和 下载 文件的接口

apijson_template APIJSON Java 模版,使用 gradle 管理依赖和构建应用

api-json-demo 基于 APIJSON,实现低代码写 CURD 代码,代替传统 ORM 框架,适配 Oracle 事务

ApiJsonByJFinal 整合 APIJSON 和 JFinal 的 Demo

apijson-go-demo apijson-go demos,提供 3 个从简单到复杂的不同场景 Demo

apijson-builder 一个方便为 APIJSON 构建 RESTful 请求的 JavaScript 库

apijson-go-ui apijson-go UI 界面配置, 支持权限管理、请求规则配置等

AbsGrade 列表级联算法,支持微信朋友圈单层评论、QQ空间双层评论、百度网盘多层(无限层)文件夹等

APIJSON-Android-RxJava 仿微信朋友圈动态实战项目,ZBLibrary(UI) + APIJSON(HTTP) + RxJava(Data)

Android-ZBLibrary Android MVP 快速开发框架,Demo 全面,注释详细,使用简单,代码严谨

apijson-dynamic-datasource 基于APIJSON,动态切换数据源、同一数据源批量操作事务一致性DEMO

xyerp 基于ApiJson的低代码ERP

quick-boot 基于 Spring Cloud 2022、Spring Boot 3、AMIS 和 APIJSON 的低代码系统。

apijson-query-spring-boot-starter 一个快速构建 APIJSON 查询条件的插件

apijson-builder 简单包装 APIJSON,相比直接构造查询 JSON 更好记,ts 编写,调整了一些参数和使用方式

感谢热心的作者们的贡献,点 ⭐Star 支持下他们吧~

腾讯犀牛鸟开源人才培养计划

#229

qiujunlin 2.接入 presto/hive/clickhouse/db2 任意一个

APIJSON 接入 clickhouse 使用demo
https://github.com/qiujunlin/APIJSONDemo

zhangshukun 2.接入 presto/hive/clickhouse/db2 任意一个

APIJSON-Demo接入db2
https://github.com/andream7/apijson-db2

hanxu 1.完善入门介绍视频

重构 APIJSON 文档
https://hanxu2018.github.io/APIJSON-DOC/
文档源码
https://github.com/HANXU2018/APIJSON-DOC
配套评论区 apijson-doc-Comment
https://github.com/HANXU2018/apijson-doc-Comment

chenyanlan 2.接入 presto/hive/clickhouse/db2 任意一个

APIJSON + SpringBoot连接ClickHouse使用的Demo
https://github.com/chenyanlann/APIJSONDemo_ClickHouse

zhaoqiming 1.完善入门介绍视频

APIJSON 后端教程(1):简介 https://www.bilibili.com/video/BV1vL411W7yd

APIJSON 后端教程(2):数据库 https://www.bilibili.com/video/BV1eB4y1N77s

APIJSON 后端教程(3):Demo https://www.bilibili.com/video/BV1FX4y1c7ug

APIJSON 后端教程(4):Boot https://www.bilibili.com/video/BV18h411z7FK

APIJSON 后端教程(5):Final https://www.bilibili.com/video/BV1GM4y1N7XJ

APIJSON 后端教程(6):uliweb_apijson https://www.bilibili.com/video/BV1yb4y1S79v/

APIJSON 后端教程(7):问题答疑 https://www.bilibili.com/video/BV1dQ4y1h7Df

APIJSON配套文档: https://github.com/kenlig/apijsondocs

huwen 2.接入 presto/hive/clickhouse/db2 任意一个

APIJSON-Demo 接入presto https://github.com/hclown9804/APIJSONDemo_presto

zhanghaoling 1.完善入门介绍视频

APIJSON结合已有项目,简化开发流程 https://github.com/haolingzhang1/APIJson--demo

说明文档 https://github.com/haolingzhang1/APIJson--demo/tree/main/APIJson集成项目说明

(1)官方demo https://github.com/haolingzhang1/APIJson--demo/blob/main/APIJson集成项目说明/APIJson集成现有项目(1)-%20官方demo.pdf

(2)单表配置 https://github.com/haolingzhang1/APIJson--demo/blob/main/APIJson集成项目说明/APIJson集成现有项目(2)-%20单表配置.pdf

zhoukaile 1.完善入门介绍视频

视频链接:https://www.bilibili.com/video/BV1Uh411z7kZ/

文档链接:https://gitee.com/funkiz/apijson_camp

lintao 1.完善入门介绍视频

APIJSON 上手教程:https://www.bilibili.com/video/BV1Pq4y1n7rJ

持续更新

https://github.com/Tencent/APIJSON/commits/master

工蜂主页

https://git.code.tencent.com/Tencent_Open_Source/APIJSON

码云主页

https://gitee.com/Tencent/APIJSON

apijson's People

Contributors

awenjackson avatar chenyanlann avatar cloudandmonkey avatar csx-bill avatar fanpocha avatar fineday009 avatar gdjs2 avatar github-ganyu avatar github291406933 avatar gukaiqi avatar haolingzhang1 avatar ifooling avatar jarrodquan avatar jerrylususu avatar justinfengchen avatar kenlig avatar kxlv2000 avatar neogitcrt1 avatar qiujunlin avatar rkyzzy avatar ruoranw avatar singledogl avatar sy-records avatar tommylemon avatar vincentcheng avatar wahowaho avatar yeyuezhishou avatar yqxlzx avatar zerounary avatar zhoulingfengofcd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

apijson's Issues

v7包冲突

在Android的app中引用v7包无法运行,提示包冲突了,不知道是哪个包冲突的。。。。
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.

com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

请问怎么设置tag

{[]: {…}, code: 406, msg: "请设置tag!一般是Table名"}[]: {count: 3, User: {…}}code: 406msg: "请设置tag!一般是Table名"proto: Object

不知道会出Node.js版本吗?

不知道会出Node.js版本吗?如果能出的话就太好了,这样前端开发人员就可以直接使用了。
希望作者能考虑一下。
谢谢!

APIJSON的安全问题

看了大佬的说明和介绍,小弟非常佩服,但仔细想想可能存在安全隐患,只要别人知道你的接口名,就可以获取他想要的内容了,不知道是否有安全机制的加入?

基于此提出的一些问题

  1. 采用本框架是否会影响到项目性能
  2. 由于本框架采用的是直接拼接sql,会不会导致有sql注入的危险?

能否使用role之类的设置限制返回结果?

大致看了眼源码,貌似没法限制返回结果么?比如查询user的话,通过外键查询其creditcard信息,但不应该所有人都可以访问到creditcard的内容才是。因为只是匆匆一瞥,也不是很熟悉java,如果没看到还请包涵。

有没有兴趣

https://github.com/Shyam-Chen/Backend-Starter-Kit
做一个类似的基于APIJSON的Backend-Starter-Kit

## Directory Structure

.
├── flow-typed
├── src
│ ├── document
│ │ └── index.js ...
│ ├── graphql
│ │ └── index.js ...
│ ├── apijson
│ │ └── index.js ...
│ ├── relational
│ │ └── index.js ...
│ ├── rest
│ │ └── index.js ...
│ ├── api.js
│ ├── config.js
│ └── pm2.js
├── test
│ ├── graphql
│ │ └── xxx.spec.js ...
│ └── rest
│ └── xxx.spec.js ...
│ ├── apijson
│ └── xxx.spec.js ...
├── .babelrc
├── .editorconfig
├── .eslintrc
├── .gitattributes
├── .gitignore
├── Dockerfile.dev
├── Dockerfile.prod
├── LICENSE
├── Procfile
├── README.md
├── circle.yml
├── docker-compose.yml
├── package.json
└── yarn.lock


讨论APIJSON的使用需求问题

一开始看到这个项目的时候我是糊涂的。因为我没理解这个工具的用途是什么。
仔细看了一下原理,原来是相当于一个转换器,通过restful api 操作数据库,并返回一些内容。
但即使我知道了这点后,我还是表示相当惊讶——读数据库不是很简单的吗,为什么要写一个转换器?
再深入了解下,我才发现这是我的盲区。因为我是前端后端都会,大部分情况,我不需要转换器,我也很多情况下拥有读取数据库的能力。对我来讲读数据库就是一件很简单的事情。为了这么简单的事情专门写个转换器太麻烦了。但,我不需要,不代表别人不需要。我猜APIJSON的主要用户是app开发者,和部分纯前端开发者(极少接触过后端)。他们可能比较需要一种“用客户端请求就能操作数据库”的能力。
作者这种发现需求的能力值得赞扬。
然后,我提一下我个人的一些建议,仅供参考。
1,因为我曾经做过复杂后端开发,所以我想说下,很多情况下,从数据库到输出json这个过程的中间,是需要逻辑处理的。直接输出数据表字段仅仅是其中一种比例不高的情况。举一些例子。对于电商情形,ta要多次计算订单数据,更新多个表,中间还可能涉及到事务,最后才会输出sjon 。如果中间过程出错了右该如何回滚,如何容错。
所以,我建议你可以多思考下有没有可能在这里做个扩展,比如说暴露一些API或者函数钩子之类的,允许别人添加自定义的逻辑处理。这块水很深,需要细想。
2,因为我自己做过web前端开发,所以,我觉得,一个前端人员如果非要提前使用json接口来调试,不想等待后端修改,我可能更多用mock数据。所以我个人猜想前端开发人员对APIJSON的使用需求不会很强烈。也因此我为什么在上面猜测APIJSON的使用群里应该更多是app开发者。因为app开发者才更需要这种“用客户端请求就能操作数据库”的能力。当然可能是我想错了。毕竟我可能不清楚其他用户群体的需求。
3,你的技术选型不好。我看到你的做法是每种语言都搞一个server端。这是个无底坑。因为你每次做个更新都要各种语言实现一遍。如果没人指出这个问题,我觉得你以后会持续把自己的精力浪费在不必要的事情上。我个人建议,你可以深入学习一种后端语言,最好是node或者go,因为这两者通过一些工具都可以把代码打包,打包后则适合在各种环境下运行。这方面我只是浅层建议,你去调研一下吧。
4,我留意到这个APIJSON项目,是因为我的项目showdoc https://github.com/star7th/showdoc 。我会先保持观察,调研下需求有没有必要集成进来,或者用我自己的方式重新实现一遍深度整合进showdoc

将整个后台打成war包

你好,请问一下怎么将这整个后台打成war包放到服务器上,我试了很多方法,可以运行,但是打war包的时候找不到引用的apijson-library库

如何解决慢查询问题?

实际开发中可能会遇到慢查询,会需要 RD 优化 sql,如果使用 APIJSON 遇到类似 case,怎么定制化的优化 sql 呢?

希望能够对demo提供一个文档

这两天详细看了APIJSON,demo也跑了,效果非常好,感谢开源奉献。自己想在开发中用的时候,却有一种无从下手的感觉(可能太菜了吧^^),包括整个执行的逻辑,自己应该重写哪些方法?希望提供一个文档,来说明一个这个demo的实现,如此愿意尝试朋友,一下子就明白了,都去看源码压力太大。
或者简单的提一下哪些类是干嘛的,我想在项目利用APIJSON写CURD,该去实现那几部分?

没看明白干什么用的

有没有懂的白话一下这个是干嘛的。
前端要怎么用,服务器要怎么做,后端怎么配合。

怎么打包到Linux上运行

在本地运行起来了但是
想编译成jar放到服务器上运行
试了mvn compile 出错
百度后在里面增加了,我的目的是增加Lib带项目里面,不知道正确不,但是mvn compile成功了。

<dependency>
	<groupId>apijson-server</groupId>
	<artifactId>apijson-server</artifactId>
	<version>2.5.5</version>
	<scope>system</scope>
	<systemPath>${project.basedir}/libs/apijson-server2.5.5.jar
	</systemPath>
</dependency>

不过mvn package还是失败 - - 没接触过JAVA,忘能指点一二

希望实现两张表 一对多 关联查询

目前APIJSON已经实现了实现如下的两张表 一对多 关联查询:

{
    "Moment": {},
    "[]": {
        "Comment": {
            "momentId@": "Moment/id"
        }
    }
}

但是如果我想查询Moment和Moment的praiseUserIdList对应的User,就不行了:

{
    "Moment": {},
    "[]": {
        "User": {
            "id@": "[]/Moment/praiseUserIdList"
        }
    }
}

关于数据安全性方面

大概看了一下文档.因为没有java环境所以没有实验不过很好奇的问一下如何解决服务端数据的安全性方面呢?数据请求都放在前台后台似乎没有请求验证这方面的逻辑.如何保证我抓包后伪造数据不会删除/修改数据库的一些重要数据呢?
如果有相关方面的实现的话请不要介意.因为就是大概看了一下文档然后提出一些小小的疑惑.并没有具体实验操作过

为何star那么多而issue那么少

作为一个开发者,比较关心反馈问题。良好的反馈和解决问题的速度是决定用不用一个东西的关键。
但我发现这里反馈的问题很少,不知道实际使用情况如何。有没有类似的社区或者什么地方可以看到其他人使用情况

文档中没看到角色权限怎么配置,似乎还没有更新上?

支持你这种方案,让前端去动态定义接口数据。
我也尝试写过类似的东东,遇到两个问题:

  1. 权限部分比较麻烦,我使用定义分组权限的方法,配置不怎么方便。
  2. 对多查询的 sql 优化问题,我使用重写字段名和后期整理的方式间接解决,大数据量有问题。(没看到你是怎么解决的)

Java demo 网站上的查询返回结果不合期望

环境信息

  • 系统: 你的demo网站
  • JDK: 你的demo网站
  • 数据库: 你的demo网站
  • APIJSON: 你的demo网站

问题描述

Java demo 网站上的查询返回结果不合期望,如

请求:

{
  "user":{
    "id":9999999999
  }
}

返回:

{"user":{"id":9999999999},"code":200,"msg":"success"}

期望这里应该返回 "user":null 或者如果这里没有user这个表,那么应该返回错误值和错误信息

请求:

{
  "User":{
    "id":9999999999
  }
}

返回:

{"code":200,"msg":"success"}

期望返回 "User":null

请求:

{
  "user":{
  },
  "[]":{
    "count":3,             
    "User":{
      "@column":"id,name" 
    }
  }
}

返回:

{"code":200,"msg":"success"}

期望如果不支持小写开头的表名,那么应该返回错误值而不是success

Oracle 读取CLOB类型的数据无法返回值

环境信息

  • 系统: Windows 10
  • JDK: 1.8.0_17
  • 数据库: Oracle 11g
  • APIJSON: 2.9.1

问题描述

有一张后台现成的用户表,部署上APIJSON后get了下。报错了。

create table USERS
(
  id                     NUMBER(10) not null,
  ....
  issys                  CHAR(1) default 'N' not null,
  mac                    CLOB,
  ...
)

错误信息

DemoSQLExecutor.DEBUG: 成功加载 数据库 驱动!
AbstractParser.INFO: 
getObject:  parentPath = null;
 name = null; request = {"Users":{"id":893}}
AbstractParser.INFO: getPath  path = null; name = null <<<<<<<<<<<<<
AbstractParser.INFO: getPath  return  >>>>>>>>>>>>>>>>
ObjectParser.DEBUG: ObjectParser  table = null; isTable = false
ObjectParser.DEBUG: ObjectParser  isEmpty = false; tri = false; drop = false
AbstractParser.INFO: 
getObject:  parentPath = ;
 name = Users; request = {"id":893}
AbstractParser.INFO: getPath  path = ; name = Users <<<<<<<<<<<<<
AbstractParser.INFO: getPath  return Users >>>>>>>>>>>>>>>>
ObjectParser.DEBUG: ObjectParser  table = Users; isTable = true
ObjectParser.DEBUG: ObjectParser  isEmpty = false; tri = false; drop = false
AbstractParser.INFO: executeSQL  config = {"alias":"Users","cacheStatic":false,"combine":{"&":["id"],"|":[],"!":[]},"content":{},"count":1,"dBAccount":"bosnds3","dBPassword":"abc123","dBUri":"jdbc:oracle:thin:@tbos-db-test.idc.vgrass.com:1521:bostest","id":"893","joinString":"","keyPrefix":false,"main":true,"method":"GET","page":0,"position":0,"prepared":true,"preparedValueList":[],"query":0,"schema":"BOSNDS3","table":"Users","test":false,"type":0,"where":{"id":"893"}}
AbstractVerifier.DEBUG: verifyRole  table = Users; method = GET; role = UNKNOWN
SQLConfig.DEBUG: getWhereItem  key = id
SQLConfig.INFO: getRealKey  saveLogic = true; originKey = id
SQLConfig.INFO: getRealKey  return key = id
SQLExecutor.DEBUG: 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 select  startTime = 1541579408062
 sql = 
 SELECT * FROM BOSNDS3.Users WHERE  (  (id='893')  )  AND rownum <= 1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SQLExecutor.INFO: >>> select  result = getCache('SELECT * FROM BOSNDS3.Users WHERE  (  (id='893')  )  AND rownum <= 1', 0) = null
DemoSQLExecutor.INFO: select  connection  = null
SQLConfig.DEBUG: getWhereItem  key = id
SQLConfig.INFO: getRealKey  saveLogic = true; originKey = id
SQLConfig.INFO: getRealKey  return key = id
SQLExecutor.DEBUG: 

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 select while (rs.next()){  index = 0


SQLExecutor.DEBUG: 
 select  while (rs.next()) { resultMap.put( 0, result); 
 >>>>>>>>>>>>>>>>>>>>>>>>>>> 


SQLExecutor.INFO: >>> select  putCache('SELECT * FROM BOSNDS3.Users WHERE  (  (id='893')  )  AND rownum <= 1', resultMap);  resultMap.size() = 1
SQLExecutor.DEBUG: 

 select  endTime = 1541579408753; duration = 691
 return resultMap.get(0);
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


AbstractParser.DEBUG: putQueryResult  queryResultMap.containsKey(valuePath) >> queryResultMap.put(path, result);
AbstractParser.INFO: 
 putQueryResult  valuePath = Users; result = {"ID":893,"AD_CLIENT_ID":37,"AD_ORG_ID":27,"ISACTIVE":"Y","MODIFIERID":893,"CREATIONDATE":"2009-01-13 11:48:17.0","MODIFIEDDATE":"2018-10-31 09:33:31.0","OWNERID":1,"PASSWORDHASH":"bos20","ISENABLED":1,"ISADMIN":1,"USERTYPE":1,"TRUENAME":"超级用户","NAME":"root","DESCRIPTION":"系统管理员","PASSWORD":"753951","EMAIL":"[email protected]","LANGUAGE":"zh_CN","IS_OTP":"N","OTP_LENGTH":8,"OTP_SECONDS":120,"IS_OTP_ONLY":"N","ISSMS":"N","IS_OUT":"N","ISSALER":"Y","C_STORE_ID":71,"DISCOUNTLIMIT":0.3,"ISOPR":"N","C_CUSTOMER_ID":1,"C_CUSTOMERUP_ID":0,"SGRADE":30,"PASSWORDRESET":"N","ISRET":"Y","WEBPOS_PER":"1000000001","ISSYS":"N","MAC":"b4519b82bc29afeb2d2205dc3aa7d2ec8279cce8afbcb04d7806342b89b6790b33f13f512203c920f333e3418032e8fa116031436923a1fe6b3010e3c458116313bb0330015e94c8d40ed4f4c866997c1e384a751f9bd75df9ef63cb90662f6c14288441b9da49aaae8e9b0784a81c7b37d774a3eb22602ff89a47b5ac546e338e1b83a30c10a6a346a9efad752f54059797a8562d7626e472037e0d1dc81d665af2b28664ded39693a0b3f6a958fa64db0c6a6e5d795c607fa6d84840dc5711a450360f45ac403f9638715829d6d34dcabe632ac5f47f610d7d56897e7d102b844fa0fcf2b5f59b4a1b6f5ed0661463ecfa0f19af16e1a1efc3da3c00d4414ad434f5aaff6a280a5ab777d7a0191e3b0e2a75eb81682eb5e8bacd0784e387b0ba6f212bf46d9739dd7030054823f668595ef8c19767f933e11f91dd17ba2d4e3f09c3a454bda1c0cf60327c15b8bbfac4fa3ce970370ec8e76fdbcbab187fcf89e59806390068b0098f52ec84c456cbc6cd7df52c29462fb1e6b304255d72d6eb6687da3e57981a5d9857522b8896fa378faafe0728a1ff7c1bd34d82b1f2bfb22b9d542acc589cd1bfc161f9008825b71dd2f94c2614a0df98e22a869a717cd62fbc17d7e61177f36e7e6509de541b7b38ddcf4f9bf1bd158625168c9efba7776238129fe4a5810c5f89ad5d0af815065fe4c694204d9db2a6451fc2e7e54dfee8c805f233223cd907be10d3933f91ea3d4392158a6cba00ece7a2ea88b7840882de70534d469193c6137dcdaae673088e6e97c85ae21c364bec5feed27f741f5d29cd8cc78ffdce6cd74b93a1dbb235faf8f3e284f172b823e5626c9e3d0e8d507f75bd21c356ec4609b118a31382638336a7374532a8a21b379856ef872d5ce6766f00ff268364eb5be93e6f82a94b846c4e36c50e13b97fcb56e26964b96e72581dde12cba13590cdffd2dfc343fb28cdb709ad1ea53f2dbe4ea6abcd0bca0d94c52dae465960ec5dd5faf59442","IS_SYS_USER":"Y","QNVL_VIP":"N","WEBPOS20_PER":"111111111111111"}
 <<<<<<<<<<<<<<<<<<<<<<<
ObjectParser.INFO: onChildParse  ObjectParser.onParse  key = Users; child = {"ID":893,"AD_CLIENT_ID":37,"AD_ORG_ID":27,"ISACTIVE":"Y","MODIFIERID":893,"CREATIONDATE":"2009-01-13 11:48:17.0","MODIFIEDDATE":"2018-10-31 09:33:31.0","OWNERID":1,"PASSWORDHASH":"bos20","ISENABLED":1,"ISADMIN":1,"USERTYPE":1,"TRUENAME":"超级用户","NAME":"root","DESCRIPTION":"系统管理员","PASSWORD":"753951","EMAIL":"[email protected]","LANGUAGE":"zh_CN","IS_OTP":"N","OTP_LENGTH":8,"OTP_SECONDS":120,"IS_OTP_ONLY":"N","ISSMS":"N","IS_OUT":"N","ISSALER":"Y","C_STORE_ID":71,"DISCOUNTLIMIT":0.3,"ISOPR":"N","C_CUSTOMER_ID":1,"C_CUSTOMERUP_ID":0,"SGRADE":30,"PASSWORDRESET":"N","ISRET":"Y","WEBPOS_PER":"1000000001","ISSYS":"N","MAC":"b4519b82bc29afeb2d2205dc3aa7d2ec8279cce8afbcb04d7806342b89b6790b33f13f512203c920f333e3418032e8fa116031436923a1fe6b3010e3c458116313bb0330015e94c8d40ed4f4c866997c1e384a751f9bd75df9ef63cb90662f6c14288441b9da49aaae8e9b0784a81c7b37d774a3eb22602ff89a47b5ac546e338e1b83a30c10a6a346a9efad752f54059797a8562d7626e472037e0d1dc81d665af2b28664ded39693a0b3f6a958fa64db0c6a6e5d795c607fa6d84840dc5711a450360f45ac403f9638715829d6d34dcabe632ac5f47f610d7d56897e7d102b844fa0fcf2b5f59b4a1b6f5ed0661463ecfa0f19af16e1a1efc3da3c00d4414ad434f5aaff6a280a5ab777d7a0191e3b0e2a75eb81682eb5e8bacd0784e387b0ba6f212bf46d9739dd7030054823f668595ef8c19767f933e11f91dd17ba2d4e3f09c3a454bda1c0cf60327c15b8bbfac4fa3ce970370ec8e76fdbcbab187fcf89e59806390068b0098f52ec84c456cbc6cd7df52c29462fb1e6b304255d72d6eb6687da3e57981a5d9857522b8896fa378faafe0728a1ff7c1bd34d82b1f2bfb22b9d542acc589cd1bfc161f9008825b71dd2f94c2614a0df98e22a869a717cd62fbc17d7e61177f36e7e6509de541b7b38ddcf4f9bf1bd158625168c9efba7776238129fe4a5810c5f89ad5d0af815065fe4c694204d9db2a6451fc2e7e54dfee8c805f233223cd907be10d3933f91ea3d4392158a6cba00ece7a2ea88b7840882de70534d469193c6137dcdaae673088e6e97c85ae21c364bec5feed27f741f5d29cd8cc78ffdce6cd74b93a1dbb235faf8f3e284f172b823e5626c9e3d0e8d507f75bd21c356ec4609b118a31382638336a7374532a8a21b379856ef872d5ce6766f00ff268364eb5be93e6f82a94b846c4e36c50e13b97fcb56e26964b96e72581dde12cba13590cdffd2dfc343fb28cdb709ad1ea53f2dbe4ea6abcd0bca0d94c52dae465960ec5dd5faf59442","IS_SYS_USER":"Y","QNVL_VIP":"N","WEBPOS20_PER":"111111111111111"}
AbstractParser.DEBUG: 



<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 GET/parseResponse  request = 
{"Users":{"id":893}}


JSON.ERROR: toJSONString  catch 
write clob error
AbstractParser.DEBUG: parse  return response = 
null
 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 



AbstractParser.DEBUG: parseResponse  endTime = 1541579408815;  duration = 890>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>



JSON.ERROR: toJSONString  catch 
write clob error

How to make another APIJSON? / 如何实现其它语言的APIJSON?

目前已有 C#, Go, Java, Node, PHP, Python 对应的 APIJSON ORM 库实现
https://github.com/Tencent/APIJSON#%E7%94%9F%E6%80%81%E9%A1%B9%E7%9B%AE

一开始不要贪大求全,实现基础的功能就好,功能后面再完善、性能后面再优化。

可以参考Java版的实现,建议从这个版本做起
https://github.com/TommyLemon/APIJSON/tree/636fe2263c01acce4ad32751cbb8a579830d9f29

这个是最简单的实现,只有7个类,将JSON转换为SQL,但也能够实现最核心的 引用赋值、单表查询、数组分页查询 了。
先完成这个,后面再优化。如果直接实现复杂功能,很可能导致一大堆问题然后坚持不下去。

FAQ & Read me before asking / 常见问题与提问前必看

本 Issue 仅限作者维护,其他人不要回复。

如果你已经知道问题所在、怎么解决,请直接 提交 Pull Request 为社区做贡献,非常感谢。
开发者也是人,也需要工作、休息、恋爱、陪伴家人、走亲会友等,也有心情不好和身体病痛,
往往没有额外的时间精力顾及一些小问题,请理解和支持,开源要大家参与贡献才会更美好~
少数个人的热情终有被耗尽的一天,只有大家共同建设和繁荣社区,才能让开源可持续发展!
#406


"APIJSON 支持/能 XX 吗?",例如 "支持全文检索吗?","支持连接池吗?", "能分库分表吗?",
问这类问题之前先想想这是不是 ORM 库或者说 SQL 的功能:
如果是那基本就支持,问之前自己先试试吧,没试出来再问;
如果不是,问问自己 "APIJSON 妨碍我用其它库实现这个需求吗?",
APIJSON 良好的兼容性让这个问题几乎不会发生,基本随便找个热门的 分库分表/连接池 等库都能简单对接起来。
#153 #107 #98 #323 #104 #108 #89 #64 #437 #436 #313 #270 #267 #265


1.尝试在 下方常见问题 (快捷键 Ctrl/Command + F) 和 历史问题 (Filters 输入框) 搜索答案。
2.尝试阅读 通用文档 或看 视频教程 找到答案。
3.尝试阅读 Demo 示例代码 以找到答案。
4.尝试自己 检查或试验 以找到答案。
5.尝试阅读 源码和注释 以找到答案。

如果以上都尝试过了请提一个新的issue。
强烈推荐阅读 ​提问的智慧-**版如何向开源社区提问题如何有效地报告 Bug如何向开源项目提交无法解答的问题
提问的智慧,更好的问题更容易获得帮助。


提 bug 请发请求和响应的【完整截屏】,没图或者 【不是全屏】的自行解决!
开发者有限的时间和精力主要放在【维护项目源码和文档】上!
【描述不详细】 或 【文档/常见问题 已有答案】 的问题直接拒绝!!
【态度 不文明/不友善】的可能会被拉黑,问题也不予解答!!!

请求参数 JSON 中表名、字段名、关键词及对应的值都是大小写敏感、逗号敏感、分号敏感、空格敏感、换行敏感,
大部分情况都不允许空格和换行,表名以大写字母开头,不要想当然,请严格按照 设计规范 来调用 API #181

常见问题

0.为什么 Issue/QQ群/微信群 没人愿意回答你的问题?

文档/注释/常见问题已解答的重复提问、缺这少那没有足够的包括截屏在内的上下文信息、提问不礼貌态度不客气等。

开发者时间精力有限,原则上优先解决 登记用户 和 贡献者 的问题,
不解决 文档/视频/常见问题 已明确说明、描述简陋 或 态度无礼 的问题!
如果你已经多次得到帮助,却仍然只索取不贡献,那就别指望大家再帮你!
私聊作者请教技术问题 或者 频繁在互助群 @ 作者 可能会被拉黑/禁言/踢群,请尊重和理解,谢谢!

如果你 提 PR 登记了自己使用 APIJSON 的公司,可以加 企业用户支持专群,作者亲自且优先答疑,
作者只有解答完了这个专群里的全部问题,才看情况解答 Issue 里的问题(对 Issue 不保证解答、更不保证及时);
其它群为互助群,由于大多数问题 在文档/Issue 已有答案却反复提 或者 缺少必要信息要来来回回沟通问清细节 已浪费太多时间,
甚至有白嫖还把自己当大爷的自私自利伸手党输出情绪,作者不再解答互助群问题,由群友互助解答,建议未登记企业的用户 填问卷提 Issue

如果你为 APIJSON 做出了以下任何一个贡献:
提交了 PR 且被合并提交了优质 Issue发表了优质文章开发了可用的生态项目
可以在群里发出贡献链接并附带说明,管理员将设置关注你一段时间,优先答疑解惑。
互助群一般解答顺序:贡献者 > 帮助他人的群友 > 带企业名昵称 > 带岗位名昵称 > 其他群友。

QQ技术群2 开始 3 个数字(1,2,3位):734

1.如何定制业务逻辑?

在后端编写 远程函数,可以拿到 session、version、当前 JSON 对象、参数名称 等,然后对查到的数据自定义处理
#101

远程函数原理和使用详细讲解
https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md#远程函数和-function-表

2.如何控制权限?

在 Access 表配置校验规则,默认不允许访问,需要对 每张表、每种角色、每种操作 做相应的配置,粒度细分到行级

#12

权限控制原理和使用详细讲解
https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md#访问控制角色和-access-表

3.如何校验参数?

在 Request 表配置校验规则 structure,提供 MUST、TYPE、VERIFY 等通用方法,可通过 远程函数 来完全自定义

https://github.com/Tencent/APIJSON/wiki#%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86

参数校验原理和使用详细讲解
https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md#访问方法请求体与-request

QQ技术群2 最后 3 个数字(7,8,9位):054

4.如何生成文档?

用 APIAuto(https://github.com/TommyLemon/APIAuto)
#85

5.如何 OR 或连接不同 key 对应的条件?

用对象关键词 @combine,例如 5.0.0+ 可以用 "@combine":"name~ | tag~" ,低于 5.0.0 只能用 "@combine":"name~,tag~"

#107

6.登录后 增删改 报错未登录?

如果是自己的网页、小程序、客户端这样报错,一般是因为没有存取 Cookie,需要在登录成功后保存 Cookie 并在调其它接口时带上
https://gitee.com/Tencent/APIJSON/issues/I1JTYH

如果使用网页工具测试报错,则很可能是 Chrome 80+ 强制前端网页 JavaScript 跨域 same-site Cookie 的策略导致,可以改用 Postman 或修改 Chrome 设置。
#166

如果是用 APIAuto,可以设置服务器代理,如果在贵司内网,则必须在内网部署 APIJSONBoot 系列后端作为代理服务,具体见 APIAuto 常见问题 1.无法访问接口
https://github.com/TommyLemon/APIAuto#1%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E6%8E%A5%E5%8F%A3

也可以像 APIJSONBoot-MultiDataSource 一样把 APIAuto 的源码放到 src/main/resources/static 目录,
再用浏览器打开本地主页
http://localhost:8080
然后把网页的 URL 输入框 改为
http://localhost:8080/login
托管服务器地址 URL 改为
http://localhost:8080
(注:假设本地服务端口为默认的 8080)

7.和 GraphQL 的区别

GraphQL 是用来聚合和过滤数据的网关,不提供增删改查功能;
APIJSON 提供万能通用的增删改查 API,零代码实时实现各种简单的和复杂的需求(一对一、一对多、多对一、多对多任意关联,各种 JOIN、各种子查询及 JOIN 和子查询相互嵌套等)
#205
#108 (comment)

8.和 Swagger, YApi 等接口工具的区别

APIJSON 不是文档工具、也不是测试工具,配套的 APIAuto 才是 HTTP 接口 的文档/测试工具
#27

9.和 Hiberante, JPA, JOOQ, Prisma, Sequelize, Linq 等其它 ORM 库的区别

只有 APIJSON 能做到不写任何代码,也不生成任何代码,直接零代码做到各种增删改查、各种结构嵌套、各种外键关联、各种条件与或非组合、各种 JOIN、各种子查询 等几乎所有 SQL 的功能,其它 ORM 库如果有做到零代码实现 APIJSON 1/10 功能 的,请直接 New issue 讨论。
#29

10.APIJSON 相比其它框架/库的优势?

APIJSONBoot 对比 SSM/SSH 等开发效率可提升 20 倍以上
#132

QQ技术群1 最后 3 个数字(7,8,9位):115

11.如何使用自增主键 id?没有主键 id 怎么增删改?

删除和修改必须要有主键。
在没有主键的表新增记录 或者 在有主键的表使用自增主键,
可在 DemoSQLConfig static 代码块中重写 SIMPLE_CALLBACK 的 newId 方法,return null 即可
#186

12.如何自定义主键 id 名称?类型可以为 varchar 等字符串吗?

DemoSQLConfig static 代码块中重写 SIMPLE_CALLBACK 的 getIdKey/getUserIdKey 方法
https://github.com/APIJSON/APIJSON-Demo/blob/master/APIJSON-Java-Server/APIJSONBoot/src/main/java/apijson/demo/DemoSQLConfig.java

类型除了 int/bigint 等整数也可以为 varchar/char 等字符串,对应代码里的 Long 和 String
https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractVerifier.java#L432-L458

13.如何实现多数据源?

可以在 DemoSQLConfig 中根据 database, schema, table 或者其它方式来区分,给 getDBUri 返回不同的 uri
#148

14.自己已经有一套鉴权系统了,不想用 APIJSON 的这套怎么办?

DemoParser 重写 Parser 中的 isNeedVerifyLogin, isNeedVerifyRole, isNeedVerifyContent 来指定是否开关某个方面的校验
https://github.com/Tencent/APIJSON/blob/22ed7cc9e801f35158e85cf6adfa5c1243eb09c9/APIJSONORM/src/main/java/apijson/orm/AbstractParser.java
#12 (comment)

也可以使用或参考其他开发者贡献的鉴权方式
#286

15.如何自动插入 create_time, update_time, creator_id, is_deleted 之类的业务上全局通用字段?

可以用 远程函数 + 引用赋值 来针对某个特定业务(表)来实现。如果是通用字段,还可以在重写 DemoObjectParser 重写 newSQLConfig,把从 Controller 经过 DemoParser 传过来的 gmt_create, create_time, creator_id, is_deleted 等 put 进去。具体见
#196

16.如何集成到自己现有的项目?

在你用的框架类似 Demo 新增几个接口调用 DemoParser 即可,
APIJSONController 只是简单封装,可以不继承,
例如 JFinal 版 Demo 中的 DemoController 就没有继承它,而是继承 JFinal 的 Controller。
#201 (comment)

建议直接把 APIJSONDemo 的 DemoSQLConfig 和 DemoController 复制到自己项目,DemoApplication 合并到自己的 Application。
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONDemo/src/main/java/apijson/demo

也可以参考其他开发者贡献的 APIJSON Todo Demo (让 APIJSON 上手更简单一些的尝试)
https://github.com/jerrylususu/apijson_todo_demo/blob/master/FULLTEXT.md

17.Demo 提供的表 SQL 文件很多,如果集成到自己项目,哪些表是必须的?

Function(注册远程函数), Request(配置参数校验规则), Access(配置权限校验规则)
https://github.com/APIJSON/APIJSON-Demo/tree/master/MySQL/single

18.如何一次性查全部数据/如何一次性查所有表记录?如何查询每页超过 100 条?如何查询超过 100 页?query:2 为什么不能查全部数据?

不支持,必须有最大数量限制前端传参 count 的值(count: 0 取最大值,不传则为默认值 Parser.getDefaultQueryCount),否则在数据量大的时候容易导致慢查询甚至拖垮数据库。
可在 DemoParser 重写 Parser.getMaxQueryCount 来指定最大查询数量,重写 Parser.getMaxQueryPage 来指定最大查询页码(从 0 开始)。
另外 query: 2 是指同时查数据和数量。
https://github.com/Tencent/APIJSON/blob/master/Document.md#3.2

#484
#259
#243

另外可以通过

"@order":"id+",
"id>": 列表最后一项的 id

"@order":"id-",
"id<": 列表最后一项的 id

这种方式来优化分页性能,并且绕过页码限制(实际可累计查询超过 10000 条 )。

19.如何实现假删除/软删除/逻辑删除?

可以用 is_deleted int 字段标记是否已删除,调 /put 接口改掉 is_deleted 的值,然后查询时可以传 is_deleted 条件或参考以上问题 15 在后端统一自动插入 is_deleted 条件
#301

20.为什么引用赋值关联的副表查不到数据?

不在同一层级必须用 完整(绝对)路径,在熟悉前最好只用 完整(绝对)路径,不要偷懒省几个字符错用 缺省(相对)路径
#335

QQ技术群2 中间 3 个数字(4,5,6位):652

21.通用文档中的存储过程示例对应的 SQL 是?

根据 userId 查评论列表

DROP PROCEDURE IF EXISTS getCommentByUserId;

DELIMITER //
CREATE PROCEDURE getCommentByUserId(IN id bigint, IN limit_ int, IN offset_ int)
BEGIN
SELECT 
    *
FROM
    sys.Comment 
WHERE userId = id
LIMIT limit_ OFFSET offset_;
END //
DELIMITER ;

SHOW PROCEDURE STATUS;

CALL sys.getCommentByUserId(82001, 10, 0);

获取所有产品

DROP PROCEDURE IF EXISTS getAllProducts;

DELIMITER //
CREATE PROCEDURE getAllProducts()
BEGIN
SELECT * FROM sys.Comment LIMIT 1;
END //
DELIMITER ;

SHOW PROCEDURE STATUS;

CALL sys.getAllProducts();

判断是否包含

DROP PROCEDURE IF EXISTS isContain;

DELIMITER //
CREATE PROCEDURE isContain(IN array text, IN val int)
BEGIN
SELECT json_contains(array,val);
END //
DELIMITER ;

SHOW PROCEDURE STATUS;

CALL sys.isContain('[82001,82002,82003]','82001');

22.APIJSON 是否支持微服务框架?支持哪些微服务框架?如何接入?

当然支持。有哪个微服务框架不支持 ORM 库这种基础组件?这个问题就像问 日志框架是否支持微服务、数据库是否支持微服务一样。
和单体服务用法一样,在需要用到的微服务里依赖和配置 APIJSON 即可。
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server

23.APIJSON 除了 HTTP+JSON 是否还支持 RPC 框架(基于 Protobuf 协议的 GRPC,基于 Thrift 协议的 Thrift 等)?

支持。例如 GRPC 基于 Protobuf 协议,IDL 内字段是通过编码固定死的,所以不能像 JSON 一样灵活,但仍然可以提供一个 string 类型字段来传输 APIJSON 的 JSON 格式字符串(请求参数、返回结果)。Thrift, BRPC 等同理。
应该没有哪个是网络层传输框架不支持 APIJSON,除非某框架不支持前后端传输字符串,但这个显然不符合逻辑,连字符串这个最基本的类型都不支持传输,谁还会用?

24.APIJSON 性能(执行效率)表现怎么样?能否达到手写 SQL 的效率?

就像 Java 的 GC 自动垃圾回收相对于 C/C++ 手动管理内存一样,ORM 相对手写 SQL 提高了下限,也拉低了上限。
APIJSON 做了预编译、前置主键条件、前置 AND 条件、字段限制(可选)、多级缓存、查询预判、读写限流 等大量性能优化,
一般生成的 SQL 执行效率在中级工程师手写优化 SQL 的水平。
#16

腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事
https://zhuanlan.zhihu.com/p/447844661

另外做性能测试或上线生产环境前先 Log.DEBUG = false 关掉日志!

25.APIJSON 支持缓存吗?支持哪些缓存框架/库?如何接入?

APIJSON 原生支持后端的数据库缓存(MySQL, PostgreSQL 等可控制 SQL_NO_CACHE 参数),原生支持 HashMap 和 ArrayList 内存缓存,支持第三方内存缓存(Redis, Tendis, Memcached, Ehcache 等),
当然通过 HTTP 协议等也支持网络缓存,通过客户端各种 SDK/ HTTP 框架或库也支持客户端内存缓存、磁盘缓存等。

想问下cache的部分基于什么实现的?
#146

APIJSON 怎么很好的跟分布式缓存结合呢?
#90

QQ技术群1 中间 3 个数字(4,5,6位):020

26.APIJSON 支持哪些数据库?是否支持 MongoDB 等非关系型数据库?

APIJSON 原生支持的数据库及版本都已在首页顶部列出
https://github.com/Tencent/APIJSON#--apijson
image

包括但不限于
MySQL 5.7+, PostgreSQL 9.5+, MS SQLServer 2012+, Oracle 12C+, IBM DB2 7.1+, TiDB 2.1+, ClickHouse 21.1+, Hive 3.1.2+, Hadoop 3.1.3+
理论上所有支持 SQL 与 JDBC/ODBC 的软件,都可以用本项目对接 CRUD,待测试:
Elasticsearch, OceanBase, Presto, Spark,Phoenix(延伸支持 HBase), Presto/Trino(延伸支持 Redis, Hive, Kafka, Elasticsearch, Thrift, Cassandra, MySQL, PostgreSQL, Oracle, MongoDB...)

目前 APIJSON 专注于 MySQL, PostgreSQL 等关系型数据库,暂时不提供原生支持 MongoDB 等非关系型数据库。
非原生支持的数据库(如 Redis 等内存数据库,MongoDB 等非关系型数据库)也可以通过重写 SQLConfig, SQLExecutor 等相关方法来接入。参考以上 25.APIJSON 支持缓存吗?

27.APIJSON 支持哪些编程语言?哪些后端(服务端)、前端(终端、客户端)?

APIJSON 目前提供实现的编程语言及前后端都已在首页顶部列出
https://github.com/Tencent/APIJSON#--apijson
image

支持的后端编程语言及版本包括但不限于 Java 1.8+, Go 1.16+, CSharp 2.1+, PHP 8.0+, Node.js ES6+, Python 3.0+
前端支持浏览器网页、PWA、SPA、微信等各家小程序、Android 客户端、iOS 客户端、Windows 客户端、macOS 客户端
以及几乎所有能运行在浏览器/终端(手机、平板、电脑、服务器、智能家居、嵌入式、机器人等)设备
并且能够发起网络请求和接收回包结果的编程语言,包括但不限于
Python, C, Java, C++, C#, Visual Basic, JavaScript, PHP, Assembly language, Go, Swift, R, MATLAB, Delphi, Object Pascal, Ruby, Objective-C, Perl, Groovy, Rust, Dart, Kotlin, Lua, Julia, Prolog, Lisp, D, Scala, TypeScript, VBScript, PowerShell, Haskell, Clojure

28.APIJSON 支持全文检索/全文搜索/全文索引吗?

原生支持 MySQL 等数据库的
#265

如果是 Elasticsearch,可能支持,试试 elasticsearch-sql
https://www.elastic.co/cn/what-is/elasticsearch-sql

29.修改了 Access/Request/Function/Document 表配置后如何生效?

重启项目,或者调用 /reload 接口,具体见 DemoController.reload 方法注释

30.APIJSON 支持上传、下载文件(Excel、图片、音视频等)吗?

不支持,APIJSON 是专为数据库表记录增删改查的 ORM 库,不要拿着锤子就看什么都觉得是钉子。
#108
#298
#323

虽然可以通过 远程函数 或 重写方法 等来写代码自定义实现扩展,但大部分情况下使用其它方案更简单方便,
网上搜索 "SpringBoot 上传文件" 等就有一大堆现成的成熟方案,其它同理,举一反三。
APIJSON 对各种库、框架的兼容性很好,几乎没有不兼容的,基本不用担心配合其它项目使用会有问题。

31.在哪查看各种功能对应请求参数的 Demo 示例?

除了通用文档的 60 多个带测试链接的各种例子
https://github.com/Tencent/APIJSON/blob/master/Document.md
image
image
image
image

配套的接口工具 APIAuto 上两百个左右例子也多看看
http://apijson.cn/api

账号及密码 13000082001/123456
image

账号及密码 13000088888/123456
image

32.Maven/Gradle 等远程依赖下载/同步不了 APIJSON, apijson-framework 等相关依赖库怎么办?

先检查仓库源是否有 jitpack.io,没有就加上,Demo 里都是有的,可以直接复制粘贴,然后 sync。
如果已有还是不行,开 VPN 网络代理试试,可以先打开 youtube.com/google.com 等网站验证 VPN 是否可用。
再不行就注释相关依赖,直接改用依赖本地 jar 包,最近发布的每个 release 的 Assets 都有相关文件:
https://github.com/APIJSON/APIJSON-Demo/releases

例如 APIJSONBoot 的 libs 目录就是添加了本地 jar 包,作为备选依赖方式
https://github.com/APIJSON/APIJSON-Demo/tree/master/APIJSON-Java-Server/APIJSONBoot/libs

相关 issue:
https://github.com/APIJSON/APIJSON-Demo/issues/21
https://github.com/APIJSON/APIJSON-Demo/issues/11
#220
#171

33.前端是否需要了解表结构、关联关系、业务逻辑等?推荐的前后端接口对接方式是?

不需要。后端把请求 URL 和 JSON 提供给前端即可,这点和传统方式差不多,推荐用 APIAuto 上传,也可以用 YApi, Postman 等其它接口管理工具。
image
image

http://apijson.cn/api

34.学习和使用 APIJSON 需要达到什么样的技术水平?熟悉哪些相关的知识?

需要达到实习生的技术水平,如果是高校学生需要拿到实习 Offer,如果是社会人员需要能拿到社招 Offer。
首先前后端都要熟悉 HTTP 协议 和 JSON 协议,熟悉 APIAuto/Postman/YApi/Rap 等任意一个 HTTP 测试工具,另外

对于后端

  • 1.熟悉 MySQL/PostgreSQL 或其它数据库的安装、建表、数据记录读写

  • 2.对应数据库 SQL 语言/方言的使用

  • 3.对应后端语言及 IDE 的使用
    例如 Java 用 InteliJ IDEA/Eclipse,Go 用 Goland,C# 用 Visual Studio, PHP 用 PHPStorm, Python 用 PyCharm 等, Node.js 用 WebStorm/VS Code 等

  • 4.JDBC 驱动的接入
    如果是 Java 或其他 JVM 语言,则 Maven 依赖必须,其次最好了解 Gradle/Jar/源码 依赖。
    C#(NuGet), Go(import), JavaScript(NPM), PHP(Composer), TypeScript(NPM) 等其它语言见各自的库依赖/包管理方式。

  • 5.掌握 Web 框架
    例如 Java 的 SpringBoot 或 JFinal, Go 的原生网络库或 Gin/GoFrame 等第三方 Web 框架, Node.js 的 Koa 或 Express 等

  • 6.掌握 APIJSON 规范

对于前端

  • 1.熟悉前端(客户端)编程语言及 IDE 的使用
    例如 JavaSccript/TypeScript 用 WebStorm/VS Code,Android Java/Kotlin 用 Android Studio,iOS Objective C/Swift 用 XCode 等

  • 2.会使用对应前端语言及相关网络请求库对 HTTP API 发起 POST application/json 的请求并解析 JSON 结果
    例如 Axios, Ajax 等

如果连这种基本要求都达不到,那就先不要用 APIJSON,先学好基础再来!

35.如何使用 SpringBoot 的 application.yml 或 application.properties 来配置数据库账号及密码?为什么 APIJSON 并发下返回数据错误,和数据库实际表记录行的值对不上?

APIJSON 的所有解析类的实例都不能复用,全部由 APIJSONORM 或 apijson-framework 等扩展项目管理!
不要用 @Conponent/@Configuration/@service 等注解在 Parser/ObjectParser/SQLConfig/SQLExecutor 等 APIJSON ORM 库的任何类及它们的任何子类!

如果想用 SpringBoot 的 application.yml 或 application.properties 来配置
https://www.google.com/search?q=%22springboot%22+AND+%22%E8%8E%B7%E5%8F%96%22+AND+%22%E9%85%8D%E7%BD%AE%22&oq=%22springboot%22+AND+%22%E8%8E%B7%E5%8F%96%22+AND+%22%E9%85%8D%E7%BD%AE%22&aqs=chrome..69i57j0i546j0i30i546.21445j0j7&sourceid=chrome&ie=UTF-8

则可以用以下任意一个方式
1.environment.getProperty
https://www.google.com/search?q=%22springboot%22+AND+%22environment.getProperty%22

2.PropertiesLoaderUtils.loadAllProperties
https://www.google.com/search?q=%22springboot%22+AND+%22PropertiesLoaderUtils.loadAllProperties%22

3.单独新建一个类

@Component
@ConfigurationProperties
public class Config { 
    public static String dbAccount;

    @Value("${mysql.account}")
    public void setDbAccount(String account) {
        dbAccount = account;
    }
}

然后再引用对应的值

public class DemoSQLConfig extends APIJSONSQLConfig {
    public String getDBAccount() {
        return Config.dbAccount;
    }
}

https://gitee.com/Tencent/APIJSON/issues/I5LWSH

其它问题见 Closed Issues

https://github.com/Tencent/APIJSON/issues?q=is%3Aissue+is%3Aclosed

What

这不就是graphql吗

看到作者在开源**的帖子,奈何无法回复,特在此开个issue

作者想法是非常前卫的,这篇文章是在查 graphql 的资料时看看到的,眼前一亮。
基于几点问题目前还不敢投入产品使用

  1. 是SQL的生成,对于大型项目来说,SQL优化是一个重点,用生成的不好把控(所以很多喜欢MyBatis而不喜欢Hibernate)。
  2. 这个虽然不是基于传统的API,但是却要基于更底层的数据库文档,数据结构前端也需要参与,当然,这是沟通问题。
  3. 对于分布式数据库来说, 有时数据是从不同的服务器取的,这个如果采用这个思路,需要怎么解决跨数据库问题?

另,看到作者回复的:

前端的验证是为了减少后端验证,提到响应速度。
比如密码字符、长度、强度如果每次都要后端验证,响应速度慢导致前端体验差。
所以前端验证通过后再交给后端,后端只要做最后一次验证就行了,前面的验证都能无延时响应。
TommyLemon

有一些不同的意见
对后端来说,原则上是不不能相信任何一个来调用接口的,因为不知道是爬虫调用还是客户端调用,都是可以模拟的。所以原则上后端都要验证一次。

返回内容的不是json头

环境信息

  • 系统:
  • JDK:
  • 数据库:
  • APIJSON:

问题描述

返回内容的不是json头

错误信息

返回内容的不是json头

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.