6

在我的 springboot 应用程序中,我有端点,这些端点由我的 springboot 应用程序中的 header 参数验证。当前的招摇 json 看起来像这样:

// part of current swagger.json
...
  "paths": {
    "/path1/{param1}": {
      "get": {
        "parameters": [
          {
            "name": "param1",
            "in": "path",
            "type": "string",
            "required": true
          }
        ]
      }
    }
  }
...

我想使用springdoc-openapi-ui配置添加缺少的参数,所以它看起来像这样:

// I want to achieve swagger.json which contains additional parameter
...
  "paths": {
    "/path1/{param1}": {
      "get": {
        "parameters": [
          {
            "name": "param1",
            "in": "path",
            "type": "string",
            "required": true
          },
          {
            "name": "missingParam",
            "in": "header",
            "type": "string",
            "required": true
          }
        ]
      }
    }
  }
...

我尝试通过将各种路径的通用参数添加到我的appplication.yml解决方案中来实现这一点

#application.yml
...
components:
  parameters:
    hiddenParam:
      in: header
      name: missingParam
      required: true
      schema:
        type: string
paths:
  /path1:
    get:
      parameters:
        - $ref: '#/components/parameters/hiddenParam'

但它不起作用。

我的问题:

  1. 有没有办法使用应用程序配置修改我的招摇结果?
  2. 我想定义参数模板并将其添加到所有端点,我该如何实现?
4

2 回答 2

8

OperationCustomizer您可以使用如下所示添加全局参数,如标题。这会将您添加parameter到每项服务中

@Configuration
public class SwaggerConfiguration {

    @Bean
    public OperationCustomizer customGlobalHeaders() {

        return (Operation operation, HandlerMethod handlerMethod) -> {

            Parameter missingParam1 = new Parameter()
                    .in(ParameterIn.HEADER.toString())
                    .schema(new StringSchema())
                    .name("missingParam1")
                    .description("header description2")
                    .required(true);
                    
            Parameter missingParam2 = new Parameter()
                    .in(ParameterIn.HEADER.toString())
                    .schema(new StringSchema())
                    .name("missingParam2")
                    .description("header description2")
                    .required(true);

            operation.addParametersItem(missingParam1);
            operation.addParametersItem(missingParam2);

            return operation;
        };
    }
}
于 2020-09-01T04:29:27.307 回答
5

最后我决定使用不同的方法。我定义了安全方案并将其作为授权标头全局应用。

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info().title("My App").version("1.0.0"))
                // Components section defines Security Scheme "mySecretHeader"
                .components(new Components()
                        .addSecuritySchemes("mySecretHeader", new SecurityScheme()
                                .type(SecurityScheme.Type.APIKEY)
                                .in(SecurityScheme.In.HEADER)
                                .name("missingParam")))
                // AddSecurityItem section applies created scheme globally
                .addSecurityItem(new SecurityRequirement().addList("mySecretHeader"));
    }

现在swagger-ui.html允许根据测试人员的要求测试带有或不带有授权标头的端点。 在此处输入图像描述

干杯!

于 2020-09-04T10:58:55.730 回答