接口规范体检

这些数字解释「为什么新人看不懂」:不是文档写得少,而是接口本身缺少可推断的规律。下面只列事实与建议,不改动任何存量接口。

1664接口总数
97.2%是 POST
76.1%路径含 CRUD 动词
0URL 版本化(/v1)
340源码无注释(名称为推断)
3kebab 与 camel 混用

1. 事实

HTTP 方法分布POST 1617、ANY 28、GET 17、PUT 297%% 以上是 POST,方法语义基本没用起来
路径含 CRUD 动词1267新人无法从路径判断这是读还是写
URL 版本化0无 /v1,接口变更无法并存
同一资源多套读命名22getX / queryXList / queryXPage / listX 并存
源码无 javadoc 注释340接口名称由 操作日志注解 / git 提交说明 / 方法名 推断,页面已标注来源
调用链来源1660 / 1661 来自源码遍历已不再依赖旧站解析结果
kebab 与 camel 混用3路径风格不统一

2. 建议(新增接口生效,不动存量)

  1. 统一动词语义:同一资源只保留一种读接口命名(建议 queryXxxPage / getXxx)。
  2. 方法语义:查询类走 GET 或至少保持 POST 一致;导出/下载与写操作区分开。
  3. 强制摘要:CI 校验「无 javadoc 摘要的 @*Mapping 方法」直接失败,数量从 340 降到 0。
  4. 错误码:源码常量已入库为错误码字典;剩下要对齐的是管理后台 system_error_code 表。
  5. 包名治理:xuchao(分销商)、common(模板)、industry、sales、spu/sku、admissionwarning 等包名无法表达业务,v2 已用业务域导航替代,建议后续重命名包。

3. 缺摘要清单(前 60,共 340)

路径方法控制器域
/promotion/coupon/couponPagePOSTPromotionCouponController营销与触达
/promotion/coupon/getCouponPOSTPromotionCouponController营销与触达
/promotion/coupon/getUnusedCouponCountPOSTPromotionCouponController营销与触达
/promotion/coupon/getCouponByGoodsIdPOSTPromotionCouponController营销与触达
/profitAccounting/cardModelPOSTCardModelProfitAccountingController统计与报表
/statistics/statCardAreaPOSTHomeStatisticsController统计与报表
/statistics/statHomeTestGETHomeStatisticsController统计与报表
/statistics/statCardStatPOSTCardStatisticsController统计与报表
/tickets/getMemberTouristPOSTTicketsMemberTouristController门票与景区
/tickets/order/exportTicketsOrderPagePOSTTicketsOrderController门票与景区
/tickets/order/getTicketsOrderDetailPOSTTicketsOrderController门票与景区
/tickets/order/getTicketsOrderTouristListPOSTTicketsOrderController门票与景区
/tickets/order/prepayPOSTTicketsOrderController门票与景区
/tickets/order/prepayXghPOSTTicketsOrderController门票与景区
/tickets/order/payNotifyPOSTTicketsOrderController门票与景区
/tickets/order/refundTicketsOrderXghPOSTTicketsOrderController门票与景区
/tickets/order/refundTicketsOrderPOSTTicketsOrderController门票与景区
/tickets/order/refundNotifyPOSTTicketsOrderController门票与景区
/tickets/exportTicketsCheckPagePOSTTicketsCheckController门票与景区
/tickets/queryTicketsShopListPOSTTicketsCheckController门票与景区
/tickets/queryTicketsCheckPOSTTicketsCheckController门票与景区
/tickets/countTicketsCheckTodayPOSTTicketsCheckController门票与景区
/tickets/queryTicketsPageBackPOSTTicketsController门票与景区
/tickets/getTicketsTypesPOSTTicketsController门票与景区
/tickets/getTicketsCitiesPOSTTicketsController门票与景区
/tickets/getTicketsDetailPOSTTicketsController门票与景区
/tickets/getSkuDetailPOSTTicketsSkuController门票与景区
/cardAppointment/exportCardAppointmentANYCardAppointmentController旅游卡
/cardAppointment/showCardAppointmentPOSTCardAppointmentController旅游卡
/cardModel/getCardModelByCardNoPOSTCardModelController旅游卡
/cardAssignment/resignCardAssignmentPOSTCardAssignmentController旅游卡
/card/updateCardActivedZengPOSTCardController旅游卡
/card/queryCardChannelActiveListPOSTCardController旅游卡
/card/exportCardChannelActiveANYCardController旅游卡
/card/getOpenapiChannelInfoListPOSTCardController旅游卡
/cardStock/countCardStockRemainPOSTCardStockController旅游卡
/hotelApi/queryHotelInfoPagePOSTHotelApiController酒店
/hotelApi/getHotelInfoPOSTHotelApiController酒店
/hotel/getHotelsListPOSTHotelInfoController酒店
/system/area/treePOSTAreaController商户·店铺·基础数据
/system/area/get-by-ipPOSTAreaController商户·店铺·基础数据
/sms/smsNotifyAliPOSTSmsCardLogController营销与触达
/checker/queryCheckerConsumeRecordPOSTCheckerConsumeRecordController核销
/checker/getCheckerListByResourceIdPOSTCheckerController核销
/checker/versionPOSTCheckerController核销
/checker/hhQrDecodePOSTCheckerController核销
/consumeEnd/getCardModelListPOSTConsumeEndController核销
/consumeEnd/queryCardCheckPOSTConsumeEndController核销
/consumeEnd/countCardCheckByCheckerPOSTConsumeEndController核销
/consumeEnd/queryCardAppointmentPOSTConsumeEndController核销
/consumeEnd/getTicketsListPOSTConsumeEndController核销
/consumeEnd/queryTicketsCheckPOSTConsumeEndController核销
/consumeEnd/statCardCheckPOSTConsumeEndController核销
/consumeEnd/statCardAppointmentPOSTConsumeEndController核销
/consumeEnd/statTicketsCheckPOSTConsumeEndController核销
/shop/getMapAddrSuggestionsPOSTShopController商户·店铺·基础数据
/aliyun/face/initFaceVerifyPOSTAliyunRealFaceVerifyController开放与对接
/aliyun/face/describeFaceVerifyPOSTAliyunRealFaceVerifyController开放与对接
/ssk/user/tokenPOSTSSKUserController开放与对接
/ssk/user/logonPOSTSSKUserController开放与对接

4. 源码解析 vs 旧站文档(tools/parse_java.py 实测)

把解析器指向 jxxx-dscp + chaos 源码重算一遍,与旧站 HTML 逐条比对。结论:旧站文档存在漏记、幽灵接口、字段名错误三类硬伤。

差异数量说明
接口总数:源码 vs 旧站1664 vs 1646源码解析多出 18 个(含 238 个旧站只给了路径没有契约的条目)
旧站「精简条目」被补全契约238这些接口在旧站只有一行路径,没有参数/响应;现在来自源码
源码有、旧站漏记18见 4.1
旧站有、源码没有(幽灵)4见 4.2,源码里是 // 注释掉的映射
分页入参字段名错误241pageNum → pageNo,见 4.3
缺中文摘要340旧站 187 → 真实 340(旧站有 -153 个接口在继承别人的注释,已纠正为无注释+推断名)
Body 无法展开的接口16类型在依赖 jar 内或为 Map/基础类型
必填标错(校验注解其实被注释掉了)20旧站读到被注释掉的 //@NotNull(...) 并据此标必填;v2 按源码实际生效情况标注

4.1 旧站漏记的接口(源码里有、文档里没有)

方法路径摘要控制器
POST/statistics/statHomePermissionxuchao: 首页统计可见性查询(不抛错,仅告知前端;无权限时前端隐藏统计区块)HomeStatisticsController
POST/statistics/statHomeSceneryCheckStatxuchao: 首页-景区入园统计(人次排行·人均 单表合并分页)HomeStatisticsController
POST/statistics/statHomeBindTrendxuchao: 首页-绑卡趋势统计(按日/月/年)HomeStatisticsController
POST/statistics/statHomeChannelSalexuchao: 首页-渠道销售四指标统计(售卡数/售卡金额/退款数/退款金额)HomeStatisticsController
POST/statistics/statHomeCardModelResourcexuchao: 首页-卡种关联资源明细(商户仅自有卡种)HomeStatisticsController
POST/statistics/statHomeCardModelBindxuchao: 首页-卡种绑卡数统计(并入销售情况列表展示,商户仅自有卡种)HomeStatisticsController
POST/statistics/statHomeCardModelOptionsxuchao: 首页卡种下拉(超管全量;发行商户仅自有卡种)HomeStatisticsController
POST/checker/hhQrDecode(源码无注释)CheckerController
POST/aliyun/face/initFaceVerify(源码无注释)AliyunRealFaceVerifyController
POST/aliyun/face/describeFaceVerify(源码无注释)AliyunRealFaceVerifyController
POST/zhyIcbc/createOrder(源码无注释)ZhyIcbcController
POST/zhyIcbc/payNotify(源码无注释)ZhyIcbcController
POST/zhyIcbc/refund(源码无注释)ZhyIcbcController
POST/zhyIcbc/refundNotify(源码无注释)ZhyIcbcController
POST/card/disable(源码无注释)OpenApiCardController
POST/cardBag/userCardListXgh(源码无注释)CardBagController
POST/cardBag/qrAndUserInfoXgh(源码无注释)CardBagController
POST/oss/uploadWithFaceHandle(源码无注释)OssController

4.2 旧站幽灵接口(源码里已注释 / 已删除,文档仍在写)

方法路径旧站摘要
POST/tickets/order/refundAppointmentOrder(无摘要)
POST/tickets/order/appointmentPayNotify—
POST/tickets/order/appointmentPrepay—
POST/tickets/order/appointmentRefundNotify—

4.3 分页入参字段名错误

旧站对所有分页接口写的是 pageNum,而 AbstractPageRequest 的真实字段是 pageNo(另有 pageSize / orderBy)——受影响接口 241 个。按旧站文档传 pageNum 会被当成未传,走默认第 1 页。

5. 旧站已知缺陷(v2 已修)

问题数量v2 处理
标「未使用」但前端确有调用45重扫 7 端源码,改为三态 + 证据 + 误判标记
精简接口链接指向不存在的锚点(死链)3为这些接口生成真实条目
index.html 与模块页计数不一致3 处全部数字由 build.py 计算 + check.py 校验
前端页「未匹配(604)」实际只渲染 61 行1 页重扫并输出全量清单
pro 环境主机指向 uat 却逐卡片展示1405 处收敛到调用手册一处并标注未确认
枚举渲染出空值 chipsms 页 14 处抽取阶段丢弃空值
接口缺少「废弃」表达手段全仓 @Deprecated = 0有标记即自动打「已废弃」徽标
@Route(auth = false) 免鉴权接口430旧站完全没体现;v2 卡片打「免鉴权」标记
由 tools/build.py 从 data/apis.json 生成 · 生成时间 2026-09-12 19:49 · 数据口径见说明 · 本页数字非手写,均来自同一份数据