如何使用Spring REST文档将顶级数组记录为响应有效负载

2022-09-03 12:50:51

我正在使用Spring REST Docs来记录REST API。我正在尝试记录以下 API 操作:

GET /subsystems
GET /subsystems/some_name

例如,对 的调用返回以下 JSON 对象:GET /subsystems/samba

{ 
  "id": "samba", 
  "description": "..." 
}

您可以使用以下代码段,该代码段使用Spring REST Docs来记录此API操作:

this.mockMvc.perform(
    get("/subsystems/samba").accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk()).andDo(
        document("subsystem").withResponseFields(
            fieldWithPath("id").description("Subsystem name"),
            fieldWithPath("description").description("Subsystem description")));

我的问题是第一个操作:调用返回一个JSON数组:GET /subsystems

[ 
  { 
    "id" : "samba", 
    "description" : "..." 
  }, 
  { "id" : "ownCloud", 
    "description" : "..." 
  },
  { "id" : "ldap", 
    "description" : "..." 
  } 
]

我找不到任何示例来说明如何在Spring REST Docs文档中记录这种结果。我该怎么做?


答案 1

这是完全可能的Spring Rest Doc 1.0

this.mockMvc.perform(
    get("/subsystems").accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk()).andDo(
        document("subsystem").withResponseFields(
            fieldWithPath("[].id").description("Subsystem name"),
            fieldWithPath("[].description").description("Subsystem description")));

要记录数组本身,请使用

this.mockMvc.perform(
    get("/subsystems").accept(MediaType.APPLICATION_JSON))
    .andExpect(status().isOk()).andDo(
        document("subsystem").withResponseFields(
            fieldWithPath("[]").description("An array of subsystems"),
            fieldWithPath("[].id").ignore(),
            fieldWithPath("[].description").ignore()));

如果您只想记录数组本身,我忽略了其他两个字段。您也可以将这两种解决方案结合起来。

享受。

编辑:我从Andy Wilkinson那里了解到,如果您记录顶级数组,则所有字段都标记为已记录。因此,如果您只想记录数组,则可以安全地跳过忽略。


答案 2

subsectionWithPath方法也与 一起工作,而不必忽略其余字段:PayloadDocumentation[]

result.andDo(docHandler.document(
    responseFields(subsectionWithPath("[]").description("A list of objects")
)));