GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — FAQ & Read me before asking / 常见问题与提问前必看 · Issue #36 · APIJSON/APIJSON Open Labels Description本 Issue 仅限作者维护,其他人不要回复。 如果你已经知道问题所在、怎么解决,请直接 提交 Pull Request 为社区做贡献,非常感谢。 "APIJSON 支持/能 XX 吗?",例如 "支持全文检索吗?","支持连接池吗?", "能分库分表吗?", 1.尝试在 下方常见问题 (快捷键 Ctrl/Command + F) 和 历史问题 (Filters 输入框) 搜索答案。 如果以上都尝试过了请提一个新的issue。 提 bug 请发请求和响应的【完整截屏】,没图或者 【不是全屏】的自行解决! 请求参数 JSON 中表名、字段名、关键词及对应的值都是大小写敏感、逗号敏感、分号敏感、空格敏感、换行敏感, 常见问题0.为什么 Issue/技术群 没人愿意回答你的问题?文档/注释/常见问题已解答的重复提问、缺这少那没有足够的包括截屏在内的上下文信息、提问不礼貌态度不客气等。 开发者时间精力有限,原则上优先解决 登记用户 和 贡献者 的问题, 如果你 提 PR 登记了自己使用 APIJSON 的公司,可以加 企业用户支持专群,作者亲自且优先答疑, 如果你为 APIJSON 做出了以下任何一个贡献: 1.如何定制业务逻辑?在后端编写 远程函数,可以拿到 session、version、当前 JSON 对象、参数名称 等,然后对查到的数据自定义处理 远程函数原理和使用详细讲解 2.如何控制权限?在 Access 表配置校验规则,默认不允许访问,需要对 每张表、每种角色、每种操作 做相应的配置,粒度细分到行级 权限控制原理和使用详细讲解 3.如何校验参数?在 Request 表配置校验规则 structure,提供 MUST、TYPE、VERIFY 等通用方法,可通过 远程函数 来完全自定义 参数校验原理和使用详细讲解 4.如何生成文档?用 APIAuto(https://github.com/TommyLemon/APIAuto) 5.如何 OR 或连接不同 key 对应的条件?用对象关键词 @combine,例如 5.0.0+ 可以用 "@combine":"name~ | tag~" ,低于 5.0.0 只能用 "@combine":"name~,tag~" 6.登录后 增删改 报错未登录?如果是自己的网页、小程序、客户端这样报错,一般是因为没有存取 Cookie,需要在登录成功后保存 Cookie 并在调其它接口时带上 也可以像 APIJSONBoot-MultiDataSource 一样把 APIAuto 的源码放到 src/main/resources/static 目录, 7.和 GraphQL 的区别GraphQL 是用来聚合和过滤数据的网关,不提供增删改查功能; 8.和 Swagger, YApi 等接口工具的区别APIJSON 不是文档工具、也不是测试工具,配套的 APIAuto 才是 HTTP 接口 的文档/测试工具 9.和 Hiberante, JPA, JOOQ, Prisma, Sequelize, Linq 等其它 ORM 库的区别只有 APIJSON 能做到不写任何代码,也不生成任何代码,直接零代码做到各种增删改查、各种结构嵌套、各种外键关联、各种条件与或非组合、各种 JOIN、各种子查询 等几乎所有 SQL 的功能,其它 ORM 库如果有做到零代码实现 APIJSON 1/10 功能 的,请直接 New issue 讨论。 10.APIJSON 相比其它框架/库的优势?APIJSONBoot 对比 SSM/SSH 等开发效率可提升 20 倍以上 11.如何使用自增主键 id?没有主键 id 怎么增删改?删除和修改必须要有主键。 12.如何自定义主键 id 名称?类型可以为 varchar 等字符串吗?DemoSQLConfig static 代码块中重写 SIMPLE_CALLBACK 的 getIdKey/getUserIdKey 方法 类型除了 int/bigint 等整数也可以为 varchar/char 等字符串,对应代码里的 Long 和 String 13.如何实现多数据源?可以在 DemoSQLConfig 中根据 database, schema, table 或者其它方式来区分,给 getDBUri 返回不同的 uri 14.自己已经有一套鉴权系统了,不想用 APIJSON 的这套怎么办?DemoParser 重写 Parser 中的 isNeedVerifyLogin, isNeedVerifyRole, isNeedVerifyContent 来指定是否开关某个方面的校验 也可以使用或参考其他开发者贡献的鉴权方式 15.如何自动插入 create_time, update_time, creator_id, is_deleted 之类的业务上全局通用字段?可以用 远程函数 + 引用赋值 来针对某个特定业务(表)来实现。如果是通用字段,还可以在重写 DemoObjectParser 重写 newSQLConfig,把从 Controller 经过 DemoParser 传过来的 gmt_create, create_time, creator_id, is_deleted 等 put 进去。具体见 16.如何集成到自己现有的项目?在你用的框架类似 Demo 新增几个接口调用 DemoParser 即可, 建议直接把 APIJSONDemo 的 DemoSQLConfig 和 DemoController 复制到自己项目,DemoApplication 合并到自己的 Application。 也可以参考其他开发者贡献的 APIJSON Todo Demo (让 APIJSON 上手更简单一些的尝试) 17.Demo 提供的表 SQL 文件很多,如果集成到自己项目,哪些表是必须的?Function(注册远程函数), Request(配置参数校验规则), Access(配置权限校验规则) 18.如何一次性查全部数据/如何一次性查所有表记录?如何查询每页超过 100 条?如何查询超过 100 页?query:2 为什么不能查全部数据?不支持,必须有最大数量限制前端传参 count 的值(count: 0 取最大值,不传则为默认值 Parser.getDefaultQueryCount),否则在数据量大的时候容易导致慢查询甚至拖垮数据库。 另外可以通过 或 这种方式来优化分页性能,并且绕过页码限制(实际可累计查询超过 10000 条 )。 19.如何实现假删除/软删除/逻辑删除?可以用 is_deleted int 字段标记是否已删除,调 /put 接口改掉 is_deleted 的值,然后查询时可以传 is_deleted 条件或参考以上问题 15 在后端统一自动插入 is_deleted 条件 20.为什么引用赋值关联的副表查不到数据?不在同一层级必须用 完整(绝对)路径,在熟悉前最好只用 完整(绝对)路径,不要偷懒省几个字符错用 缺省(相对)路径 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 库这种基础组件?这个问题就像问 日志框架是否支持微服务、数据库是否支持微服务一样。 23.APIJSON 除了 HTTP+JSON 是否还支持 RPC 框架(基于 Protobuf 协议的 GRPC,基于 Thrift 协议的 Thrift 等)?支持。例如 GRPC 基于 Protobuf 协议,IDL 内字段是通过编码固定死的,所以不能像 JSON 一样灵活,但仍然可以提供一个 string 类型字段来传输 APIJSON 的 JSON 格式字符串(请求参数、返回结果)。Thrift, BRPC 等同理。 24.APIJSON 性能(执行效率)表现怎么样?能否达到手写 SQL 的效率?就像 Java 的 GC 自动垃圾回收相对于 C/C++ 手动管理内存一样,ORM 相对手写 SQL 提高了下限,也拉低了上限。 腾讯业务百万数据 6s 响应,APIJSON 性能优化背后的故事 另外做性能测试或上线生产环境前先 Log.DEBUG = false 关掉日志! 25.APIJSON 支持缓存吗?支持哪些缓存框架/库?如何接入?APIJSON 原生支持后端的数据库缓存(MySQL, PostgreSQL 等可控制 SQL_NO_CACHE 参数),原生支持 HashMap 和 ArrayList 内存缓存,支持第三方内存缓存(Redis, Tendis, Memcached, Ehcache 等), 想问下cache的部分基于什么实现的? APIJSON 怎么很好的跟分布式缓存结合呢? 26.APIJSON 支持哪些数据库?是否支持 MongoDB 等非关系型数据库?APIJSON 原生支持的数据库及版本都已在首页顶部列出 包括但不限于 目前 APIJSON 专注于 MySQL, PostgreSQL 等关系型数据库,暂时不提供原生支持 MongoDB 等非关系型数据库。 27.APIJSON 支持哪些编程语言?哪些后端(服务端)、前端(终端、客户端)?APIJSON 目前提供实现的编程语言及前后端都已在首页顶部列出 支持的后端编程语言及版本包括但不限于 Java 1.8+, Go 1.16+, CSharp 2.1+, PHP 8.0+, Node.js ES6+, Python 3.0+ 28.APIJSON 支持全文检索/全文搜索/全文索引吗?原生支持 MySQL 等数据库的 如果是 Elasticsearch,可能支持,试试 elasticsearch-sql 29.修改了 Access/Request/Function/Document 表配置后如何生效?重启项目,或者调用 /reload 接口,具体见 DemoController.reload 方法注释 30.APIJSON 支持上传、下载文件(Excel、图片、音视频等)吗?不支持,APIJSON 是专为数据库表记录增删改查的 ORM 库,不要拿着锤子就看什么都觉得是钉子。 虽然可以通过 远程函数 或 重写方法 等来写代码自定义实现扩展,但大部分情况下使用其它方案更简单方便, 31.在哪查看各种功能对应请求参数的 Demo 示例?除了通用文档的 60 多个带测试链接的各种例子 配套的接口工具 APIAuto 上两百个左右例子也多看看 32.Maven/Gradle 等远程依赖下载/同步不了 APIJSON, apijson-framework 等相关依赖库怎么办?先检查仓库源是否有 jitpack.io,没有就加上,Demo 里都是有的,可以直接复制粘贴,然后 sync。 例如 APIJSONBoot 的 libs 目录就是添加了本地 jar 包,作为备选依赖方式 相关 issue: 33.前端是否需要了解表结构、关联关系、业务逻辑等?推荐的前后端接口对接方式是?不需要。后端把请求 URL 和 JSON 提供给前端即可,这点和传统方式差不多,推荐用 APIAuto 上传,也可以用 YApi, Postman 等其它接口管理工具。 34.学习和使用 APIJSON 需要达到什么样的技术水平?熟悉哪些相关的知识?需要达到实习生的技术水平,如果是高校学生需要拿到实习 Offer,如果是社会人员需要能拿到社招 Offer。 对于后端
对于前端
如果连这种基本要求都达不到,那就先不要用 APIJSON,先学好基础再来! 35.如何使用 SpringBoot 的 application.yml 或 application.properties 来配置数据库账号及密码?为什么 APIJSON 并发下返回数据错误,和数据库实际表记录行的值对不上?APIJSON 的所有解析类的实例都不能复用,全部由 APIJSONORM 或 apijson-framework 等扩展项目管理! 如果想用 SpringBoot 的 application.yml 或 application.properties 来配置 则可以用以下任意一个方式 2.PropertiesLoaderUtils.loadAllProperties 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 Issueshttps://github.com/Tencent/APIJSON/issues?q=is%3Aissue+is%3Aclosed Activity
MetadataMetadataAssigneesLabelsTypeProjectsMilestoneRelationshipsDevelopmentIssue actions |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |