fix: header parameters
This commit is contained in:
parent
862371e153
commit
8f66ac9272
2
.gitignore
vendored
2
.gitignore
vendored
@ -16,3 +16,5 @@ Thumbs.db
|
|||||||
|
|
||||||
#
|
#
|
||||||
.swagger-codegen
|
.swagger-codegen
|
||||||
|
swagtest
|
||||||
|
*.exe
|
124
example/user.api
124
example/user.api
@ -1,81 +1,81 @@
|
|||||||
info(
|
info(
|
||||||
title: "type title here"
|
title: "type title here"
|
||||||
desc: "type desc here"
|
desc: "type desc here"
|
||||||
author: "type author here"
|
author: "type author here"
|
||||||
email: "type email here"
|
email: "type email here"
|
||||||
version: "type version here"
|
version: "type version here"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
||||||
//注册请求结构
|
//注册请求结构
|
||||||
RegisterReq {
|
RegisterReq {
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
Mobile string `json:"mobile"`
|
Mobile string `json:"mobile"`
|
||||||
}
|
}
|
||||||
|
|
||||||
LoginReq {
|
LoginReq {
|
||||||
Username string `json:"username"` //测试
|
Username string `json:"username"` //测试
|
||||||
Password string `json:"password"`//测试2
|
Password string `json:"password"` //测试2
|
||||||
}
|
AppId string `header:"appId"` //APPID-TEST
|
||||||
UserInfoReq {
|
}
|
||||||
Id string `path:"id"`
|
UserInfoReq {
|
||||||
}
|
Id string `path:"id"`
|
||||||
|
}
|
||||||
|
|
||||||
UserInfoReply {
|
UserInfoReply {
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Age int `json:"age"`
|
Age int `json:"age"`
|
||||||
Birthday string `json:"birthday"`
|
Birthday string `json:"birthday"`
|
||||||
Description string `json:"description"`
|
Description string `json:"description"`
|
||||||
Tag []string `json:"tag"`
|
Tag []string `json:"tag"`
|
||||||
Tags [][]string `json:"tags"`
|
Tags [][]string `json:"tags"`
|
||||||
}
|
}
|
||||||
|
|
||||||
UserSearchReq {
|
UserSearchReq {
|
||||||
KeyWord string `form:"keyWord"` // 关键词
|
KeyWord string `form:"keyWord"` // 关键词
|
||||||
}
|
}
|
||||||
|
|
||||||
ErrorResponse {
|
ErrorResponse {
|
||||||
Code string `json:"code"`
|
Code string `json:"code"`
|
||||||
Message string `json:"message"`
|
Message string `json:"message"`
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@server(
|
@server(
|
||||||
prefix: /api
|
prefix: /api
|
||||||
)
|
)
|
||||||
|
|
||||||
service user-api {
|
service user-api {
|
||||||
@doc(
|
@doc(
|
||||||
summary: 注册
|
summary: 注册
|
||||||
)
|
)
|
||||||
@handler register
|
@handler register
|
||||||
post /user/register (RegisterReq)
|
post /user/register (RegisterReq)
|
||||||
|
|
||||||
@doc(
|
@doc(
|
||||||
summary: 登录
|
summary: 登录
|
||||||
)
|
)
|
||||||
@handler login
|
@handler login
|
||||||
post /user/login (LoginReq)
|
post /user/login (LoginReq)
|
||||||
|
|
||||||
@doc(
|
@doc(
|
||||||
summary: 获取用户信息
|
summary: 获取用户信息
|
||||||
)
|
)
|
||||||
@handler getUserInfo
|
@handler getUserInfo
|
||||||
/*
|
/*
|
||||||
@respdoc-400 (
|
@respdoc-400 (
|
||||||
100101: out of authority
|
100101: out of authority
|
||||||
100102: user not exist
|
100102: user not exist
|
||||||
) // Error code list
|
) // Error code list
|
||||||
*/
|
*/
|
||||||
/* @respdoc-500 (ErrorResponse) // Server Error */
|
/* @respdoc-500 (ErrorResponse) // Server Error */
|
||||||
get /user/:id (UserInfoReq) returns (UserInfoReply)
|
get /user/:id (UserInfoReq) returns (UserInfoReply)
|
||||||
|
|
||||||
@doc(
|
@doc(
|
||||||
summary: 用户搜索
|
summary: 用户搜索
|
||||||
)
|
)
|
||||||
@handler searchUser
|
@handler searchUser
|
||||||
get /user/search (UserSearchReq) returns (UserInfoReply)
|
get /user/search (UserSearchReq) returns (UserInfoReply)
|
||||||
}
|
}
|
@ -162,73 +162,13 @@ func renderServiceRoutes(service spec.Service, groups []spec.Group, paths swagge
|
|||||||
}
|
}
|
||||||
if defineStruct, ok := route.RequestType.(spec.DefineStruct); ok {
|
if defineStruct, ok := route.RequestType.(spec.DefineStruct); ok {
|
||||||
for _, member := range defineStruct.Members {
|
for _, member := range defineStruct.Members {
|
||||||
if member.Name == "" {
|
if hasHeaderParameters(member) {
|
||||||
memberDefineStruct, _ := member.Type.(spec.DefineStruct)
|
parameters = parseHeader(member, parameters)
|
||||||
for _, m := range memberDefineStruct.Members {
|
|
||||||
if strings.Contains(m.Tag, "header") {
|
|
||||||
tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)]
|
|
||||||
ftype, format, ok := primitiveSchema(tempKind, m.Type.Name())
|
|
||||||
if !ok {
|
|
||||||
ftype = tempKind.String()
|
|
||||||
format = "UNKNOWN"
|
|
||||||
}
|
|
||||||
sp := swaggerParameterObject{In: "header", Type: ftype, Format: format}
|
|
||||||
|
|
||||||
for _, tag := range m.Tags() {
|
|
||||||
sp.Name = tag.Name
|
|
||||||
if len(tag.Options) == 0 {
|
|
||||||
sp.Required = true
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
required := true
|
|
||||||
for _, option := range tag.Options {
|
|
||||||
if strings.HasPrefix(option, optionsOption) {
|
|
||||||
segs := strings.SplitN(option, equalToken, 2)
|
|
||||||
if len(segs) == 2 {
|
|
||||||
sp.Enum = strings.Split(segs[1], optionSeparator)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(option, rangeOption) {
|
|
||||||
segs := strings.SplitN(option, equalToken, 2)
|
|
||||||
if len(segs) == 2 {
|
|
||||||
min, max, ok := parseRangeOption(segs[1])
|
|
||||||
if ok {
|
|
||||||
sp.Schema.Minimum = min
|
|
||||||
sp.Schema.Maximum = max
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(option, defaultOption) {
|
|
||||||
segs := strings.Split(option, equalToken)
|
|
||||||
if len(segs) == 2 {
|
|
||||||
sp.Default = segs[1]
|
|
||||||
}
|
|
||||||
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
|
|
||||||
required = false
|
|
||||||
}
|
|
||||||
|
|
||||||
if strings.HasPrefix(option, exampleOption) {
|
|
||||||
segs := strings.Split(option, equalToken)
|
|
||||||
if len(segs) == 2 {
|
|
||||||
sp.Example = segs[1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sp.Required = required
|
|
||||||
}
|
|
||||||
sp.Description = strings.TrimLeft(m.Comment, "//")
|
|
||||||
parameters = append(parameters, sp)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if strings.ToUpper(route.Method) == http.MethodGet {
|
if strings.ToUpper(route.Method) == http.MethodGet {
|
||||||
for _, member := range defineStruct.Members {
|
for _, member := range defineStruct.Members {
|
||||||
if strings.Contains(member.Tag, "path") {
|
if hasPathParameters(member) || hasHeaderParameters(member) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if embedStruct, isEmbed := member.Type.(spec.DefineStruct); isEmbed {
|
if embedStruct, isEmbed := member.Type.(spec.DefineStruct); isEmbed {
|
||||||
@ -483,7 +423,7 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.
|
|||||||
schema.Title = defineStruct.Name()
|
schema.Title = defineStruct.Name()
|
||||||
|
|
||||||
for _, member := range defineStruct.Members {
|
for _, member := range defineStruct.Members {
|
||||||
if hasPathParameters(member) {
|
if hasPathParameters(member) || hasHeaderParameters(member) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
kv := keyVal{Value: schemaOfField(member)}
|
kv := keyVal{Value: schemaOfField(member)}
|
||||||
@ -494,8 +434,7 @@ func renderReplyAsDefinition(d swaggerDefinitionsObject, m messageMap, p []spec.
|
|||||||
if kv.Key == "" {
|
if kv.Key == "" {
|
||||||
memberStruct, _ := member.Type.(spec.DefineStruct)
|
memberStruct, _ := member.Type.(spec.DefineStruct)
|
||||||
for _, m := range memberStruct.Members {
|
for _, m := range memberStruct.Members {
|
||||||
|
if hasHeaderParameters(m) || hasPathParameters(m) {
|
||||||
if strings.Contains(m.Tag, "header") {
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -560,6 +499,15 @@ func hasPathParameters(member spec.Member) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func hasHeaderParameters(member spec.Member) bool {
|
||||||
|
for _, tag := range member.Tags() {
|
||||||
|
if tag.Key == "header" {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func schemaOfField(member spec.Member) swaggerSchemaObject {
|
func schemaOfField(member spec.Member) swaggerSchemaObject {
|
||||||
ret := swaggerSchemaObject{}
|
ret := swaggerSchemaObject{}
|
||||||
|
|
||||||
@ -751,3 +699,73 @@ func contains(s []string, str string) bool {
|
|||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseHeader(m spec.Member, parameters []swaggerParameterObject) []swaggerParameterObject {
|
||||||
|
|
||||||
|
tempKind := swaggerMapTypes[strings.Replace(m.Type.Name(), "[]", "", -1)]
|
||||||
|
ftype, format, ok := primitiveSchema(tempKind, m.Type.Name())
|
||||||
|
if !ok {
|
||||||
|
ftype = tempKind.String()
|
||||||
|
format = "UNKNOWN"
|
||||||
|
}
|
||||||
|
sp := swaggerParameterObject{In: "header", Type: ftype, Format: format}
|
||||||
|
|
||||||
|
for _, tag := range m.Tags() {
|
||||||
|
sp.Name = tag.Name
|
||||||
|
if len(tag.Options) == 0 {
|
||||||
|
sp.Required = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
required := true
|
||||||
|
for _, option := range tag.Options {
|
||||||
|
if strings.HasPrefix(option, optionsOption) {
|
||||||
|
segs := strings.SplitN(option, equalToken, 2)
|
||||||
|
if len(segs) == 2 {
|
||||||
|
sp.Enum = strings.Split(segs[1], optionSeparator)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(option, rangeOption) {
|
||||||
|
segs := strings.SplitN(option, equalToken, 2)
|
||||||
|
if len(segs) == 2 {
|
||||||
|
min, max, ok := parseRangeOption(segs[1])
|
||||||
|
if ok {
|
||||||
|
sp.Schema.Minimum = min
|
||||||
|
sp.Schema.Maximum = max
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(option, defaultOption) {
|
||||||
|
segs := strings.Split(option, equalToken)
|
||||||
|
if len(segs) == 2 {
|
||||||
|
sp.Default = segs[1]
|
||||||
|
}
|
||||||
|
} else if strings.HasPrefix(option, optionalOption) || strings.HasPrefix(option, omitemptyOption) {
|
||||||
|
required = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.HasPrefix(option, exampleOption) {
|
||||||
|
segs := strings.Split(option, equalToken)
|
||||||
|
if len(segs) == 2 {
|
||||||
|
sp.Example = segs[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sp.Required = required
|
||||||
|
}
|
||||||
|
sp.Description = strings.TrimLeft(m.Comment, "//")
|
||||||
|
if m.Name == "" {
|
||||||
|
memberDefineStruct, ok := m.Type.(spec.DefineStruct)
|
||||||
|
if !ok {
|
||||||
|
return parameters
|
||||||
|
}
|
||||||
|
for _, cm := range memberDefineStruct.Members {
|
||||||
|
if hasHeaderParameters(cm) {
|
||||||
|
parameters = parseHeader(cm, parameters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return append(parameters, sp)
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user