1

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

我将它加载到 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
4

2 回答 2

1

RAML 规范明确没有定义对象类型的验证

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

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

于 2020-08-08T13:43:31.430 回答
0

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

于 2020-09-03T06:21:39.307 回答