Skip to content

REST 故障排查

端点返回 404

现象: 请求 /api/EntityName 返回 404 Not Found

原因:

  • 实体未启用 REST(rest.enabledfalse)。
  • URL 中的实体名与配置不匹配(大小写不一致)。
  • REST 路径前缀被自定义。

排查步骤:

  1. 检查 dab-config.json 中该实体的 rest.enabled,确认不是 false。省略时默认 true
  2. 确认 URL 中实体名与配置完全一致(区分大小写)。/api/book/api/Book 是不同的路径。
  3. 如果使用 --rest.path 自定义了 REST 前缀,确认 URL 使用了正确的路径。
  4. 检查 runtime.rest.enabled 全局开关是否为 true

405 Method Not Allowed

现象: POSTPUTPATCHDELETE 返回 405 Method Not Allowed

原因: 当前 HTTP 方法不在实体的 rest.methods 允许列表中(仅存储过程实体会限制方法)。

排查步骤:

  1. 检查 dab-config.json 中该实体的 rest.methods 数组——是否包含了当前请求的方法。
  2. 存储过程默认只允许 POST,如需 GET 需显式配置 "methods": ["GET"]
  3. 表实体不支持通过 rest.methods 限制 HTTP 方法——检查是否误将表实体当成了存储过程。

$filter 查询返回意外结果或报错

现象: $filter 返回空结果、错误结果或 Invalid filter expression 之类的错误。

常见原因与解决:

原因解决
筛选语法不符合 OData 规范字符串值必须用单引号:$filter=title eq 'Dune',不是双引号
字段名使用了数据库列名而非 API 名如果配置了 fields.alias,筛选中使用别名
字段值类型不匹配数字字段不加引号,字符串字段必须加引号
URL 编码问题空格应为 %20,单引号应为 %27
存储过程不支持筛选$filter 对存储过程实体无效

调试方法: 调高日志级别(--LogLevel Debug),查看生成的 SQL 语句,确认筛选条件是否被正确翻译为 WHERE 子句。

CORS 错误

现象: 浏览器调用 API 时因 CORS 策略被阻止。

排查步骤:

  1. 检查 dab-config.jsonhost.cors.origins 数组是否包含了前端来源。
  2. 本地开发中可以设为 "origins": ["*"] 快速解决。
  3. 生产环境应精确指定允许的域名,不使用 *
  4. 修改 CORS 配置后重启服务。

POST 创建返回 400

常见原因:

原因解决
request-body-stricttrue,请求体有数据库不存在的字段移除非表字段,或设为 "request-body-strict": false
主键字段使用了自动生成列(IDENTITYSERIAL)但请求体包含了该字段值不在请求体中传自动生成的主键
视图无主键且请求了按主键路径的 PUT/PATCH在配置中指定 fields[].primary-key

PUT 操作插入而非更新

原因: 默认情况下 PUT 是 upsert——记录存在则更新,不存在则插入。不带 If-Match 头时这是正常行为。

解决: 如果需要严格的"仅更新"语义,添加请求头 If-Match: *。记录不存在时会返回 404 而非创建。

无键 PUT/PATCH 失败

现象: 对自动生成主键的表执行 PUT /api/Book(URL 中无主键)失败。

原因: 所有主键列都是自动生成(IDENTITY 等)时,无键 PUT/PATCH 才被允许。如果存在非自动生成的主键列,URL 中必须包含这些主键。

排查: 确认表结构中的主键列是否都是自动生成类型。复合主键中只要有一列需要手动指定,就不能使用无键操作。

大数据量查询超时

排查步骤:

  1. 检查是否使用了分页——不传 $first 时默认最多返回 100 条,但如果数据量大,查询本身可能超时。
  2. 检查数据库连接字符串中的超时参数(Command Timeout/CommandTimeout/DefaultCommandTimeout),适当调高。
  3. 优化数据库查询——添加索引、优化 WHERE 条件。

下一步

数据墙DBW 产品文档与开发指南。