Api蓝图与实时api上的dredd失败了吗?

时间:2017-11-17 11:59:40

标签: oracle apiblueprint apiary.io dredd mson

我正在将dredd从1.08升级到最新版本,而在此期间,我正在尝试验证我们的api文档,用实时测试API编写蓝图并且它失败了。

由于测试是针对实时api运行的,因此从api返回的响应包含的值不同于blurprint文档中指定的值。我从dredd收到以下错误。

有人可以帮我搞清楚吗? :)

  

正文:在'/ data / email'没有枚举匹配:“dredd_testzz@keyflow.se”

     

body:在'/ data / firstName'没有枚举匹配:“Sniper”

     

正文:在'/ data / lastName'没有枚举匹配:“狼”

     

正文:在'/ data / verified'没有枚举匹配:false

## `ResponseSchema` (object)

+ email: `john.doe@example.com` (string, required) - Email address 
+ firstName: John (string, required) - First name 
+ lastName: Doe (string, required) - Last name 
+ verified: true (boolean, required) - True 

# Group Account

## Login [/login/?]
Login user

### Login [POST]
Authentication required.

+ Request (application/json)

    + Attribute (LoginInputSchema)

+ Response 200 (application/json; charset=UTF-8)

+ Attribute
    + status: 200 (number, required, fixed)
    + data (ResponseSchema, required, fixed)

dredd生成的JSON Schema位于

之下
bodySchema: {
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "status": {
      "type": "number",
      "enum": [
        200
      ]
    },
    "data": {
      "type": "object",
      "properties": {

        "email": {
          "type": "string",
          "enum": [
            "john.doe@example.com"
          ],
          "description": "Email address of the guest."
    },
    "firstName": {
      "type": "string",
      "enum": [
        "John"
      ],
      "description": "First name of the guest."
    },
    "lastName": {
      "type": "string",
      "enum": [
        "Doe"
      ],
      "description": "Last name of the guest."
    },
    "verified": {
      "type": "boolean",
      "enum": [
        true
      ],
      "description": "The user is verified or not"
    },

  },
      "required": [
        "email",
        "firstName",
        "lastName",
        "verified",
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "status",
    "data"
  ]
}

1 个答案:

答案 0 :(得分:2)

TL; DR:尝试在API蓝图文档中使用fixed-type代替fixedfixed要求样本值为实际值。

更详细的解释:

body: At '/data/email' No enum match for: "dredd_testzz@keyflow.se"

这意味着被测服务器返回的响应包含一个可正确解析的JSON主体,但根据API描述提供的模式,主体无效。

错误指向/data/email,这意味着{"data": {"email": ...属性存在问题。此外,它提到了enum值,并且实际响应包含dredd_testzz@keyflow.se,枚举不允许这样做。其他错误类似。

查看API描述,响应中预期的规范如下:

+ Attribute
    + status: 200 (number, required, fixed)
    + data (ResponseSchema, required, fixed)

fixed属性,如MSON规范的4.3 Nested Member Types部分所述,不仅修复了结构,还修复了所有值,并在数据结构中进一步传播:

  

...可以指定固定来表示"值对象"必须存在所有属性的地方,属性的值必须是其嵌套成员类型中指定的值(如果有)。此外,这种对象类型结构绝不能包含任何其他属性。

我认为您想要使用fixed-type来修改结构。这在Dredd文档的Making Dredd Validation Stricter部分中进一步说明。