Swagger 如何使用vendorExtensions进行扩展

Swagger或者叫OpenAPI是一套完备且通用的API标准,本文并不介绍Swagger的用法,仅针对某些场景需要扩展(扩展需要以"x-")该如何开发做紧要的介绍。

一切开始之前,有一点需要keep in mind,即增加扩展的位置不同,所用的方法不同,所以需要对Swagger的标准有所了解,可参考官方文档


springfox目前只允许三种扩展实现:

  • ListVendorExtension:列表的形式,该对象支持泛型,最终形式:”x-field”:[{field:value}]
  • ObjectVendorExtension:对象的扩展形式,最终的扩展形式是:”x-field”:[{field:value}]
  • StringVendorExtension:string类型的扩展实现,最终的扩展形式是”x-field”:”value”

Swagger根对象扩展

以在info中添加一个x-logo为例

"info": {
        "description": "<div style='font-size:14px;color:red;'>swagger-bootstrap-ui-demo RESTful APIs</div>",
        "version": "1.0",
        "title": "swagger-bootstrap-ui!!!",
        "termsOfService": "http://www.xxx.com/",
        "contact": {
            "name": pxxxx@domain.com"
        },
	"x-logo": {
	    "url": "http://",
	    "color": "#090807"
	}
    },
    ...

后台代码:

ObjectVendorExtension logo = new ObjectVendorExtension("x-logo");
logo.addProperty(new StringVendorExtension("url", "https://xxx.svg"));
logo.addProperty(new StringVendorExtension("color", "#090807"));

return new ApiInfoBuilder()
    .title("swagger-bootstrap-ui!!")
    .extensions(Lists.newArrayList(logo))
    .description("<div style='font-size:14px;color:red;'>swagger-bootstrap-ui-demo RESTful APIs</div>")
    .termsOfServiceUrl("http://www.xxx.com/")
    .version("1.0.0")
    .build();

内部对象扩展

给Path添加一个扩展属性x-order为例

@Component
@Order(Ordered.HIGHEST_PRECEDENCE+100)
public class OperationPositionBulderPlugin implements OperationBuilderPlugin {
    @Override
    public void apply(OperationContext context) {
        context.operationBuilder().extensions(Lists.newArrayList(new StringVendorExtension("x-order","1")));
    }

    @Override
    public boolean supports(DocumentationType delimiter) {
        return true;
    }
}

详细介绍可以参考