在 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 中引发错误