在 RAML 中验证查询参数

Posted

技术标签:

【中文标题】在 RAML 中验证查询参数【英文标题】:Validating query parameters in RAML 【发布时间】:2020-11-18 13:50:01 【问题描述】:

我需要创建一个具有四个可能的 HTTP 查询参数的 API。参数一或参数二是必需的。其他是可选的。从 Github 上的官方RAML version 1.0 specification 中,我在RAML queryString example 中发现了一个几乎完全相同的场景。

我将它加载到 Mulesoft 设计中心进行测试。 RAML 在设计中心没有产生任何错误,一切看起来都很好。根据 RAML 中的第一个示例,以下 URL 应该会产生成功(200 OK):

GET https://(mocking URL)/locations?start=2&lat=12&long=13

当我通过 Postman 发送它时,它会到达模拟服务,但我收到以下错误:


    "code": "REQUEST_VALIDATION_ERROR",
    "message": "Error validating query string: expected type: JSONObject, found: Null"
 

我不确定这是设计中心的限制,还是我的 URL 中有问题。有谁知道我做错了什么?

这是来自官方规范的 RAML 示例:

#%RAML 1.0
title: Illustrate query parameter variations
types:
  lat-long: # lat & long required; mutually exclusive with location
    properties:
     lat: number
      long: number
  loc: # location required; mutually exclusive with lat & long
    properties:
      location:
  paging: # each is optional, not exclusive with anything
    properties:
      start?: number
      page-size?: number
/locations:
  get:
    queryString:
      type: [paging,  lat-long | loc ]
      examples:
        first:
          value:
            start: 2
            lat: 12
            long: 13
        second:
          value:
            start: 2
            page-size: 20
            location: 1,2
        third:  # not valid
          value:
            lat: 12
            location: 2
          strict: false # because it's not valid

【问题讨论】:

这是模拟服务@Tony 中的一个错误。 @George 感谢您的回复。这个错误是否记录在某个地方? 是的,但它不被广大观众所接受。 【参考方案1】:

这看起来像是 MuleSoft Anypoit 模拟工具中的一个错误。 RAML 规范是正确的。 您可能希望通过 MuleSoft 支持提出缺陷。

【讨论】:

【参考方案2】:

RAML 规范explicitly does not define validation for object types:

当查询参数声明时,RAML 没有定义验证 为查询的值指定以下任何类型 参数:对象类型、非标量类型的联合或数组 type 如果数组的基础类型是对象类型或联合 非标量类型。处理器可以默认处理 将类型应用于实例的 JSON 查询参数值 该查询参数,或者他们可能允许基于其他处理 注释。

即使模拟服务最终实现了验证,对查询参数使用简单类型(如字符串和数字)可能会更好。这是有道理的,因为通常查询参数就是这样使用的。

【讨论】:

我不明白您的回答如何适用于我的问题。我使用的 RAML 是从您引用的部分正上方的 queryString 定义中逐字获取的,并且 URL 符合 RAML 中的第一个示例。除此之外,每个参数都输入为标量数。我从模拟服务收到的消息对我来说没有意义。按照我的阅读方式,您引用的文本适用于 queryParameters,它位于文档中的 QueryString 部分之后(并且独立于)。 你说得对,我错过了它是查询字符串而不是查询参数。

以上是关于在 RAML 中验证查询参数的主要内容,如果未能解决你的问题,请参考以下文章

Raml 验证器在 javax.xml.validation.SchemaFactory.newSchema 中引发错误

RAML中基于查询参数的动态调用

RAML 文件的验证

Osprey RAML 验证错误处理

在 RAML 中描述 URI 参数

将 Swagger JSON 转换为 RAML/YAML