// Package api_doc ... // // Description : api_doc ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2024-12-24 10:34 package api_doc import ( "errors" "git.zhangdeman.cn/gateway/api-doc/define" "git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/serialize" "net/http" "strings" ) // ParseSwagger2 解析swagger2.0版本文档 // // Author : go_developer@163.com<白茶清欢> // // Date : 10:33 2024/12/24 func ParseSwagger2(docContent []byte) (*define.DocParseResult, error) { var ( err error swaggerDoc define.Swagger ) if err = serialize.JSON.UnmarshalWithNumber(docContent, &swaggerDoc); nil != err { return nil, errors.New("parse swagger json fail : " + err.Error()) } docResult := &define.DocParseResult{ Domain: swaggerDoc.Host, Title: swaggerDoc.Info.Title, Description: swaggerDoc.Info.Description, UriList: make([]*define.UriBaseConfig, 0), } if docResult.UriList, err = buildUriList(&swaggerDoc); nil != err { return nil, err } return docResult, nil } // 解析uri列表 func buildUriList(swaggerDoc *define.Swagger) ([]*define.UriBaseConfig, error) { uriList := make([]*define.UriBaseConfig, 0) for itemUri, itemUriMethodConfig := range swaggerDoc.Paths { for requestMethod, methodConfig := range itemUriMethodConfig { initSwagger2UriMethodConfig(requestMethod, methodConfig) uriResult := &define.UriBaseConfig{ Uri: swaggerDoc.BasePath + "/" + strings.TrimLeft(itemUri, "/"), Method: strings.ToUpper(requestMethod), ContentType: methodConfig.Consumes[0], OutputContentType: methodConfig.Produces[0], TagList: methodConfig.Tags, Summary: methodConfig.Summary, Description: methodConfig.Description, ParamList: buildSwagger2ParamConfig(swaggerDoc, methodConfig.Parameters), ResultList: nil, } uriList = append(uriList, uriResult) } } return uriList, nil } // 初始化配置请求方法 返回类型 func initSwagger2UriMethodConfig(requestMethod string, methodConfig *define.SwaggerPathConfig) { if len(methodConfig.Consumes) == 0 { // 未配置请求方法, 写请求 json , 读请求 form if strings.ToUpper(requestMethod) == http.MethodPost || strings.ToUpper(requestMethod) == http.MethodPut || strings.ToUpper(requestMethod) == http.MethodPatch || strings.ToUpper(requestMethod) == http.MethodDelete { methodConfig.Consumes = []string{ consts.MimeTypeJson, } } else { methodConfig.Consumes = []string{ consts.MimeTypeXWWWFormUrlencoded, } } } if len(methodConfig.Produces) == 0 { // 未配置输出数据类型, 默认 json methodConfig.Produces = []string{ consts.MimeTypeJson, } } } // buildSwagger2ParamConfig 构建请求参数配置 func buildSwagger2ParamConfig(swaggerDoc *define.Swagger, paramConfigList []*define.SwaggerPathConfigParameter) []*define.ParamConfig { res := make([]*define.ParamConfig, 0) // 解析参数 for _, paramConfig := range paramConfigList { paramConfigBuildConfig := &define.ParamConfig{ Location: GetParamLocation(paramConfig.In).String(), Path: paramConfig.Name, Type: GetParamType(paramConfig.Type, paramConfig.Format).String(), Title: paramConfig.Name, Description: paramConfig.Description, Required: paramConfig.Required, } res = append(res, paramConfigBuildConfig) if nil != paramConfig.Schema && len(paramConfig.Schema.Ref) > 0 { // TODO : 可以继续展开 } } return res }