在 Mule 4 中验证多个输入查询参数

validating multiple input query params in Mule 4

我正在使用 Mule 4.4 社区版 我有一个带有 4 个查询参数的 GET 端点:

empId ( mandatory )

collegeId ( mandatory )

subject ( either subject or score is required )

score ( either subject or score is required )

进行这些验证的最佳方式是什么?

这是我尝试过但对结果不满意的方法... 通过 Open API 规范(必需属性)

验证 'empId' 和 'collegeId'
parameters:
    - name: empId
      in: query
      description: The web user account
      required: true
      schema:
        type: string
    - name: collegeId
      in: query
      description: The web organisation
      required: true

但是,如果我只是针对这些传递一个空字符串,则不会触发任何验证.... 尝试使用模式,例如 :

pattern: "^[A-Za-z0-9]+$"

虽然这确实可以防止空/空字符串,但错误消息并不令人满意:

Invalid value ' ' for uri parameter empId. string [ ] does not match pattern ^[A-Za-z0-9]+$

问题:我可以覆盖 Open API 规范中的错误消息以使其看起来更轻松吗?

现在是 'subject' 和 'score' ,其中至少一个应该是非空或空的 除了这个 link here 没有找到任何东西 我们如何强制两者中至少有一个具有非空/空值(通过 Open api spec 3.0.1)

所以我想我会手工验证,使用验证器,但它们看起来很笨重 ex - 对于像 'not null or empty' 这样的简单检查必须使用两个验证器.....

<flow name="get:employee-search"  >
    
    <validation:any doc:name="Any"  >
        <validation:is-not-null doc:name="Is subject not null"  value="#[attributes.queryParams['subject']]" message="${validation.subject}" />
        <validation:is-not-null doc:name="Is score not null"  value="#[attributes.queryParams['score']]" message="${validation.score}" />
        <validation:is-not-blank-string doc:name="Is subject not blank string"  value="#[attributes.queryParams['subject']]" message="${validation.subject}"/>
        <validation:is-not-blank-string doc:name="Is score not blank string"  value="#[attributes.queryParams['score']]" message="${validation.score}"/>
    </validation:any>

如果两个字段都没有发送,那么两个验证器的错误消息都会显示

问题: 我应该写一个 groovy 脚本来执行这些简单的验证吗 只是想知道这是最好的方法还是更好的方法?

我认为您不能仅通过 Open API Specs 自定义错误消息,但是当您在应用程序中生成流程时,它也会为 APIKIT 验证创建错误处理程序。您可以在 错误请求 错误处理程序中编写转换消息,以通过检查错误消息来修改响应。

现在对于验证部分,如果您正在检查 validation:is-not-blank-string,则不需要检查 validation:is-not-null,因为后者还会检查字符串是否为 Null。此外,您还必须合并剩余的两个验证器,否则即使分数通过,如果主题为空,它也会失败。要处理此问题,您可以使用 validation:is-false or validation:all Scope.

使用 validation:all 时,您会将两个 validation:is-not-blank-string 包装在一个范围内,并且仅当两个验证都失败时才会失败。

使用 validation:is-false 您可以在模块中编写自定义编织表达式,即 returns true 如果两个字段均为空白。这将使此验证失败(因为它不是假的)并且您可以自定义错误消息。像这样

<validation:is-false doc:name="Is false"
    doc:id="c62a27a4-d030-4f72-9610-eacbb74dd593"
    expression="#[isBlank(attributes.queryParams.score) and isBlank(attributes.queryParams.subject)]"
    message="Both Score and Subject can not be empty" />