【问题标题】:How to create a custom POST request-body in SwaggerUI如何在 SwaggerUI 中创建自定义 POST 请求正文
【发布时间】:2019-03-11 14:56:43
【问题描述】:

我试图让 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 只包含一个 bytearray 'data' 和一个 enum 'da'

编辑

好的,我发现为什么生成的响应体是错误的,swagger通过查看公共参数和所有 getter来确定请求体的参数。由于我的方法中不仅有与参数相关的 getter,因此 UI 中显示的内容太多。 您可以通过使用注释来防止参数显示在 UI 中

@ApiModelProperty(required = false, hidden = true)

但是,我的每种方法都没有唯一的正文,我将其中的一些进行了分组,这导致 UI 中生成的请求正文与其所在的方法不准确。因此我想要在 UI 中完全不显示正文。

  • 有没有办法为请求禁用模型架构?

【问题讨论】:

    标签: java httprequest swagger swagger-ui


    【解决方案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)DigestDataContainerDTO 的字段构建DigestDataContainer 对象。

    【讨论】:

    • 因为在我的示例中我只有一个控制器,这会导致与以前相同的情况。 '.any()' 只是选择所有处理程序,而 basePackage 允许您选择我猜的特定处理程序。我用一个更具体的例子更新了这个问题。我希望你能帮助我。
    • 请添加您的 REST 方法声明
    • 添加了一个示例方法
    • DigestDataContainer too :-) 我猜,它不包含两个字符串字段,不是吗?
    • 好的,我发现了模型模式错误的原因并更新了问题。你碰巧知道如何禁用它吗?
    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2023-04-10
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多