fix: header parameters
This commit is contained in:
		
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -15,4 +15,6 @@ Thumbs.db
 | 
				
			|||||||
*.ipr
 | 
					*.ipr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
.swagger-codegen
 | 
					.swagger-codegen
 | 
				
			||||||
 | 
					swagtest
 | 
				
			||||||
 | 
					*.exe
 | 
				
			||||||
							
								
								
									
										126
									
								
								example/user.api
									
									
									
									
									
								
							
							
						
						
									
										126
									
								
								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 {
 | 
					 | 
				
			||||||
        Username string `json:"username"`
 | 
					 | 
				
			||||||
        Password string `json:"password"`
 | 
					 | 
				
			||||||
        Mobile string `json:"mobile"`
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    LoginReq {
 | 
						//注册请求结构
 | 
				
			||||||
        Username string `json:"username"` //测试
 | 
						RegisterReq {
 | 
				
			||||||
        Password string `json:"password"`//测试2
 | 
							Username string `json:"username"`
 | 
				
			||||||
    }
 | 
							Password string `json:"password"`
 | 
				
			||||||
    UserInfoReq {
 | 
							Mobile   string `json:"mobile"`
 | 
				
			||||||
        Id string `path:"id"`
 | 
						}
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    UserInfoReply {
 | 
						LoginReq {
 | 
				
			||||||
        Name string `json:"name"`
 | 
							Username string `json:"username"` //测试
 | 
				
			||||||
        Age int `json:"age"`
 | 
							Password string `json:"password"` //测试2
 | 
				
			||||||
        Birthday string `json:"birthday"`
 | 
							AppId    string `header:"appId"`  //APPID-TEST
 | 
				
			||||||
        Description string `json:"description"`
 | 
						}
 | 
				
			||||||
        Tag []string `json:"tag"`
 | 
						UserInfoReq {
 | 
				
			||||||
        Tags [][]string `json:"tags"`
 | 
							Id string `path:"id"`
 | 
				
			||||||
    }
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    UserSearchReq {
 | 
						UserInfoReply {
 | 
				
			||||||
        KeyWord string `form:"keyWord"` // 关键词
 | 
							Name        string     `json:"name"`
 | 
				
			||||||
    }
 | 
							Age         int        `json:"age"`
 | 
				
			||||||
 | 
							Birthday    string     `json:"birthday"`
 | 
				
			||||||
 | 
							Description string     `json:"description"`
 | 
				
			||||||
 | 
							Tag         []string   `json:"tag"`
 | 
				
			||||||
 | 
							Tags        [][]string `json:"tags"`
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ErrorResponse {
 | 
						UserSearchReq {
 | 
				
			||||||
        Code string `json:"code"`
 | 
							KeyWord string `form:"keyWord"` // 关键词
 | 
				
			||||||
        Message string `json:"message"`
 | 
						}
 | 
				
			||||||
    }
 | 
					
 | 
				
			||||||
 | 
						ErrorResponse {
 | 
				
			||||||
 | 
							Code    string `json:"code"`
 | 
				
			||||||
 | 
							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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user