You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenAPI验证查询字符串数组参数失败及路由匹配异常排查

OpenAPI验证防火墙转发请求的两类问题:数组参数校验失败与路由匹配错误

我们在通过OpenAPI文档验证防火墙转发至.NET Core 8后端的接口请求时,遇到了以下两类问题:


一、数组查询参数estados始终触发校验错误

相关OpenAPI文档片段

openapi: 3.0.1
...
/api/pedidosassistencias/pesquisa:
    get:
      tags:
        - PedidosAssistencias
      summary: Devolve uma lista paginada de pedidos de assistência compatível com os critérios indicados.
      description: Devolve uma lista paginada ResumoPedidoAssistencia pedidos de assistência compatível com os critérios indicados.
      parameters:
        - name: estados
          in: query
          description: Estados do pedido a filtrar
          schema:
            type: array
            items:
              $ref: '#/components/schemas/EstadoPedido'
            description: Estados do pedido a filtrar
...

其中EstadoPedido是枚举类型,estados参数值只能为该枚举中的项。

尝试过的传参方式(均触发校验错误)

  • 单个参数:https://XXX/api/pedidosassistencias/pesquisa?estados=2&idLocalTrabalho=100
  • 单个参数带方括号:https://XXX/api/pedidosassistencias/pesquisa?estados[]=2&idLocalTrabalho=100
  • 单个参数带索引:https://XXX/api/pedidosassistencias/pesquisa?estados[0]=2&idLocalTrabalho=100
  • 多个参数重复键名:https://XXX/api/pedidosassistencias/pesquisa?estados=2&estados=3&idLocalTrabalho=100
  • 多个参数带方括号:https://XXX/api/pedidosassistencias/pesquisa?estados[]=2&estados[]=3&idLocalTrabalho=100
  • 多个参数带索引:https://XXX/api/pedidosassistencias/pesquisa?estados[0]=2&estados[1]=3&idLocalTrabalho=100

移除estados参数后,请求可正常通过验证。

最初使用estados[pos]格式是为了规避防火墙的重复参数名检查(.NET Core 8后端可通过[]语法正确解析为数组)。根据OpenAPI文档,默认form风格(explode: true)的重复键名传参方式(estados=2&estados=3)应该符合规范,但防火墙仍提示参数不符合OpenAPI文档。


二、路由匹配错误:误将/api/equipamentos/pesquisa匹配到带路径参数的端点

测试其他API时发现路由匹配异常:调用/api/equipamentos/pesquisa时,收到错误提示:

API Validation violation - Path parameter "idEquipamento" validation failure : Failed to validate schema

但该端点并不存在idEquipamento路径参数。查看OpenAPI文档,存在两个相关路径:

路径1:带路径参数的端点

/api/equipamentos/{idEquipamento}:
    get:
      parameters:
        - name: idEquipamento
          in: path
          required: true
          schema:
            type: integer
            description: Id do equipamento pai.
            format: int32

路径2:独立的pesquisa端点

存在/api/equipamentos/pesquisa的定义,但验证器错误地将请求匹配到了/api/equipamentos/{idEquipamento},而非正确的pesquisa端点。


请问这两类问题的根源是什么?是否是防火墙的OpenAPI验证功能存在bug?

内容的提问来源于stack exchange,提问作者Luis Abreu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:43:15