如何在SwaggerUI中创建自定义POST请求主体

时间:2019-03-11 14:56:43

标签: java httprequest swagger swagger-ui

我正在尝试让SwaggerUI看起来对我来说正常工作。我有一堆POST方法,并且SwaggerUI确实已经在Web-UI中生成了响应和请求正文,但是请求正文不正确。如何为POST方法创建自定义请求正文?

SpringFoxConfig

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;

import com.google.common.collect.ImmutableList;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SpringFoxConfig {
    @Bean
    public Docket apiDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .useDefaultResponseMessages(false)
                //.globalResponseMessage(RequestMethod.POST, ImmutableList.of(new ResponseMessage(200, "Some global OK message",null)))
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()            
                .apiInfo(getApiInfo()); 
    }

    private ApiInfo getApiInfo() {
        return new ApiInfo("RESTlike API",
                "An Api to call functions",
                "",
                "",
                "",
                "",
                "");
    }
}

例如 UI中显示的架构是

{
"da": "MD5",
  "data": {
    "value": [
      "string"
    ]
  }
}

这不是正确的输入,并且会引发错误。 在此示例中,正确输入为:

{
"da": "MD5",
"data": "String"
}

该架构的数据来自何处,以及如何更改/覆盖它。

相应的方法

@ResponseBody
@PostMapping("/digest")
public StringWrapper digestData(@RequestBody DigestDataContainer params) throws IOException {
    return new StringWrapper(//code);
}

DigestDataContainer仅包含一个字节数组'data'和一个枚举'da'

修改

好吧,我发现了为什么生成的响应主体是错误的,大摇大摆地通过查看公共参数和 all 吸气剂来确定请求主体的参数。由于我的方法中不仅只有与参数相关的吸气剂,因此UI中显示的内容过多。 您可以通过用

注释来防止在用户界面中显示参数
@ApiModelProperty(required = false, hidden = true)

但是,我的每种方法都没有唯一的主体,我将其中一些分组了,这导致UI中生成的请求主体与所使用的方法不准确。因此,我想要完全不显示用户界面中的主体。

  • 是否可以禁用请求的模型架构?

1 个答案:

答案 0 :(得分:1)

最简单的方法(像我一样)是使用DTO对象。

在您的情况下,只需使用方法

即可代替您的digestData(@RequestBody DigestDataContainer params)
@ResponseBody
@PostMapping("/digest")
public StringWrapper digestData(@RequestBody DigestDataContainerDTO ddcDTO) throws IOException {

    DigestDataContainer ddc = new DigestDataContainer(ddcDTO);

    // process your DigestDataContainer object as before
}

DigestDataContainerDTO在哪里

public class DigestDataContainerDTO {
    private String da;
    private String data;
    // getters/setters
}

DigestDataContainer(ddcDTO)DigestDataContainer的字段构建DigestDataContainerDTO对象。