优化GET类请求文档生成
This commit is contained in:
172
generate.go
172
generate.go
@ -184,6 +184,81 @@ func (g *Generate) AddApiFromInAndOut(paramType reflect.Type, resultType reflect
|
||||
if _, exist := g.docData.Paths[baseCfg.Uri]; !exist {
|
||||
g.docData.Paths[baseCfg.Uri] = &define.PathConfig{}
|
||||
}
|
||||
// 接口文档初始化
|
||||
cfg := g.getApiDocBaseCfg(baseCfg, paramType)
|
||||
paramMethod := []string{
|
||||
http.MethodGet, http.MethodHead, http.MethodConnect, http.MethodOptions, http.MethodTrace,
|
||||
}
|
||||
if wrapper.ArrayType(paramMethod).Has(baseCfg.Method) >= 0 {
|
||||
cfg.RequestBody = nil // get类请求没有request body
|
||||
// 参数解析
|
||||
g.ParseReadConfigParam(baseCfg, cfg, paramType)
|
||||
} else {
|
||||
// post类解析
|
||||
paramSchemaName := g.AddComponentsSchema("", paramType.PkgPath(), paramType)
|
||||
for _, itemType := range baseCfg.ContentType {
|
||||
cfg.RequestBody.Content[itemType] = &define.Media{
|
||||
Schema: &define.Schema{
|
||||
Ref: g.getSchemaRef(paramSchemaName),
|
||||
},
|
||||
Example: "",
|
||||
Examples: nil,
|
||||
Encoding: nil,
|
||||
}
|
||||
}
|
||||
}
|
||||
// 无论什么请求, 对于result解析逻辑一致
|
||||
resultSchemaName := g.AddComponentsSchema("", resultType.PkgPath(), resultType)
|
||||
for _, itemOutputType := range baseCfg.OutputContentType {
|
||||
cfg.Responses[fmt.Sprintf("%v", http.StatusOK)].Content[itemOutputType] = &define.Media{
|
||||
Schema: &define.Schema{
|
||||
Ref: g.getSchemaRef(resultSchemaName),
|
||||
},
|
||||
Example: "",
|
||||
Examples: nil,
|
||||
Encoding: nil,
|
||||
}
|
||||
}
|
||||
g.setApiDoc(baseCfg, cfg)
|
||||
return nil
|
||||
}
|
||||
|
||||
// setApiDoc 设置文档配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 16:13 2025/2/14
|
||||
func (g *Generate) setApiDoc(baseCfg *define.UriBaseConfig, apiDocCfg *define.PathItemOperationConfig) {
|
||||
switch baseCfg.Method {
|
||||
case http.MethodGet:
|
||||
g.docData.Paths[baseCfg.Uri].Get = apiDocCfg
|
||||
case http.MethodHead:
|
||||
g.docData.Paths[baseCfg.Uri].Head = apiDocCfg
|
||||
case http.MethodPost:
|
||||
g.docData.Paths[baseCfg.Uri].Post = apiDocCfg
|
||||
case http.MethodPut:
|
||||
g.docData.Paths[baseCfg.Uri].Put = apiDocCfg
|
||||
case http.MethodPatch:
|
||||
g.docData.Paths[baseCfg.Uri].Patch = apiDocCfg
|
||||
case http.MethodDelete:
|
||||
g.docData.Paths[baseCfg.Uri].Delete = apiDocCfg
|
||||
case http.MethodConnect:
|
||||
g.docData.Paths[baseCfg.Uri].Connect = apiDocCfg
|
||||
case http.MethodOptions:
|
||||
g.docData.Paths[baseCfg.Uri].Options = apiDocCfg
|
||||
case http.MethodTrace:
|
||||
g.docData.Paths[baseCfg.Uri].Trace = apiDocCfg
|
||||
default:
|
||||
panic("unknown method: " + baseCfg.Method)
|
||||
}
|
||||
}
|
||||
|
||||
// getApiDocBaseCfg 获取接口文档的基础配置
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 16:10 2025/2/14
|
||||
func (g *Generate) getApiDocBaseCfg(baseCfg *define.UriBaseConfig, paramType reflect.Type) *define.PathItemOperationConfig {
|
||||
defaultPkgPath := wrapper.String(strings.TrimLeft(baseCfg.Uri, "/")).SnakeCaseToCamel()
|
||||
cfg := &define.PathItemOperationConfig{
|
||||
Tags: baseCfg.TagList,
|
||||
@ -227,63 +302,7 @@ func (g *Generate) AddApiFromInAndOut(paramType reflect.Type, resultType reflect
|
||||
})
|
||||
}
|
||||
}
|
||||
paramMethod := []string{
|
||||
http.MethodGet, http.MethodHead, http.MethodConnect, http.MethodOptions, http.MethodTrace,
|
||||
}
|
||||
if wrapper.ArrayType(paramMethod).Has(baseCfg.Method) >= 0 {
|
||||
cfg.RequestBody = nil // get类请求没有request body
|
||||
// Get类请求, TODO : get类解析
|
||||
// 参数解析
|
||||
g.ParseReadConfigParam(baseCfg, cfg, paramType)
|
||||
} else {
|
||||
// post类解析
|
||||
paramSchemaName := g.AddComponentsSchema("", paramType.PkgPath(), paramType)
|
||||
for _, itemType := range baseCfg.ContentType {
|
||||
cfg.RequestBody.Content[itemType] = &define.Media{
|
||||
Schema: &define.Schema{
|
||||
Ref: g.getSchemaRef(paramSchemaName),
|
||||
},
|
||||
Example: "",
|
||||
Examples: nil,
|
||||
Encoding: nil,
|
||||
}
|
||||
}
|
||||
}
|
||||
// 无论什么请求, 对于result解析逻辑一致
|
||||
resultSchemaName := g.AddComponentsSchema("", resultType.PkgPath(), resultType)
|
||||
for _, itemOutputType := range baseCfg.OutputContentType {
|
||||
cfg.Responses[fmt.Sprintf("%v", http.StatusOK)].Content[itemOutputType] = &define.Media{
|
||||
Schema: &define.Schema{
|
||||
Ref: g.getSchemaRef(resultSchemaName),
|
||||
},
|
||||
Example: "",
|
||||
Examples: nil,
|
||||
Encoding: nil,
|
||||
}
|
||||
}
|
||||
switch baseCfg.Method {
|
||||
case http.MethodGet:
|
||||
g.docData.Paths[baseCfg.Uri].Get = cfg
|
||||
case http.MethodHead:
|
||||
g.docData.Paths[baseCfg.Uri].Head = cfg
|
||||
case http.MethodPost:
|
||||
g.docData.Paths[baseCfg.Uri].Post = cfg
|
||||
case http.MethodPut:
|
||||
g.docData.Paths[baseCfg.Uri].Put = cfg
|
||||
case http.MethodPatch:
|
||||
g.docData.Paths[baseCfg.Uri].Patch = cfg
|
||||
case http.MethodDelete:
|
||||
g.docData.Paths[baseCfg.Uri].Delete = cfg
|
||||
case http.MethodConnect:
|
||||
g.docData.Paths[baseCfg.Uri].Connect = cfg
|
||||
case http.MethodOptions:
|
||||
g.docData.Paths[baseCfg.Uri].Options = cfg
|
||||
case http.MethodTrace:
|
||||
g.docData.Paths[baseCfg.Uri].Trace = cfg
|
||||
default:
|
||||
panic("unknown method: " + baseCfg.Method)
|
||||
}
|
||||
return nil
|
||||
return cfg
|
||||
}
|
||||
|
||||
// ParseReadConfigParam 解析get类请求参数
|
||||
@ -298,6 +317,9 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe
|
||||
if inputType.Kind() != reflect.Struct {
|
||||
panic(requestCfg.Uri + " : request param not struct")
|
||||
}
|
||||
if nil == baseReqCfg.Parameters {
|
||||
baseReqCfg.Parameters = make([]*define.PathConfigParameter, 0)
|
||||
}
|
||||
for i := 0; i < inputType.NumField(); i++ {
|
||||
propertyName := ParseStructField.GetParamName(inputType.Field(i))
|
||||
if propertyName == "-" {
|
||||
@ -315,14 +337,28 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe
|
||||
fieldType.Kind() == reflect.Slice {
|
||||
if convertType := g.realBaseType2SwaggerType(fieldType.String()); !strings.HasPrefix(convertType, "[]") && convertType != inputType.Field(i).Type.Kind().String() {
|
||||
// 针对基础类型指针
|
||||
baseReqCfg.Parameters = append(baseReqCfg.Parameters, &define.PathConfigParameter{
|
||||
Name: ParseStructField.GetParamName(inputType.Field(i)),
|
||||
In: consts.SwaggerParameterInQuery,
|
||||
Description: ParseStructField.GetParamDesc(inputType.Field(i)),
|
||||
Required: ValidateRule.IsRequired(inputType.Field(i)),
|
||||
Deprecated: ParseStructField.Deprecated(inputType.Field(i)),
|
||||
Schema: &define.Schema{
|
||||
Type: g.realBaseType2SwaggerType(inputType.Field(i).Type.String()),
|
||||
Items: nil,
|
||||
Ref: "",
|
||||
Format: realInputTypeFormat,
|
||||
},
|
||||
AllowEmptyValue: false,
|
||||
Style: "",
|
||||
Explode: false,
|
||||
AllowReserved: false,
|
||||
Ref: "",
|
||||
})
|
||||
continue
|
||||
}
|
||||
|
||||
} else {
|
||||
if nil == g.docData.Paths[requestCfg.Uri].Get {
|
||||
g.docData.Paths[requestCfg.Uri].Get = &define.PathItemOperationConfig{}
|
||||
}
|
||||
g.docData.Paths[requestCfg.Uri].Get.Parameters = append(g.docData.Paths[requestCfg.Uri].Get.Parameters, &define.PathConfigParameter{
|
||||
baseReqCfg.Parameters = append(baseReqCfg.Parameters, &define.PathConfigParameter{
|
||||
Name: ParseStructField.GetParamName(inputType.Field(i)),
|
||||
In: consts.SwaggerParameterInQuery,
|
||||
Description: ParseStructField.GetParamDesc(inputType.Field(i)),
|
||||
@ -342,6 +378,18 @@ func (g *Generate) ParseReadConfigParam(requestCfg *define.UriBaseConfig, baseRe
|
||||
})
|
||||
}
|
||||
}
|
||||
switch requestCfg.Method {
|
||||
case http.MethodGet:
|
||||
g.docData.Paths[requestCfg.Uri].Get = baseReqCfg
|
||||
case http.MethodHead:
|
||||
g.docData.Paths[requestCfg.Uri].Head = baseReqCfg
|
||||
case http.MethodConnect:
|
||||
g.docData.Paths[requestCfg.Uri].Connect = baseReqCfg
|
||||
case http.MethodOptions:
|
||||
g.docData.Paths[requestCfg.Uri].Options = baseReqCfg
|
||||
case http.MethodTrace:
|
||||
g.docData.Paths[requestCfg.Uri].Trace = baseReqCfg
|
||||
}
|
||||
}
|
||||
|
||||
// AddComponentsSchema 添加schema
|
||||
|
Reference in New Issue
Block a user