Fix: Ptr issues with POST/PUT bodies; Add nonempty query params only

This commit is contained in:
Thilo Karraß 2020-10-15 08:25:24 +02:00
parent 5d074b181a
commit 5cddea77d1
3 changed files with 26 additions and 5 deletions

View File

@ -10,7 +10,7 @@ func (e Encoder) Api(server openapi.Server) string {
tBuf := bytes.Buffer{}
tBuf.WriteString(fmt.Sprintf("package %v\n\n", e.Package))
tBuf.WriteString(e.GeneratedHeader())
tBuf.WriteString("import (\n \"fmt\"\n \"reflect\"\n \"strings\"\n)\n\n")
tBuf.WriteString("import (\n \"fmt\"\n \"net/url\"\n \"reflect\"\n \"strings\"\n)\n\n")
tBuf.WriteString(Comment(server.Description, 0))
tBuf.WriteString(fmt.Sprintf("const %v_OPENAPI_BASE string = \"%v\"\n\n", strings.ToUpper(e.Package), server.Url))
// replace func:
@ -34,6 +34,22 @@ func joinIfArray(v interface{}) string {
}
return tBuf.String()
}
func addQueryParameter(q *url.Values, k string, v interface{}) {
tHasValue := false
switch reflect.TypeOf(v).Kind() {
case reflect.Slice, reflect.Array:
s := reflect.ValueOf(v)
tHasValue = s.Len() > 0
default:
if v != nil {
tHasValue = !reflect.DeepEqual(v, reflect.Zero(reflect.TypeOf(v)).Interface())
}
}
if tHasValue {
q.Add("pageNumber", joinIfArray(v))
}
}
`)
return tBuf.String()
}

View File

@ -185,17 +185,18 @@ func (e Encoder) Funcs(tag string, operations []*openapi.Operation) string {
}
// post/put params ("body")
tBuf.WriteString(" var tBuf *bytes.Buffer = nil\n")
tBufBody := "nil"
if op.RequestBody != nil {
tBuf.WriteString(" var tData []byte = nil\n")
tBuf.WriteString(" tData, err = json.Marshal(data)\n")
tBuf.WriteString(" if err != nil {\n")
tBuf.WriteString(" return\n")
tBuf.WriteString(" }\n")
tBuf.WriteString(" tBuf = bytes.NewBuffer(tData)\n")
tBuf.WriteString(" tBuf := bytes.NewBuffer(tData)\n")
tBufBody = "tBuf"
}
tBuf.WriteString(fmt.Sprintf(" req, _ := http.NewRequest(\"%v\", tPath, tBuf)\n", op.Method()))
tBuf.WriteString(fmt.Sprintf(" req, _ := http.NewRequest(\"%v\", tPath, %v)\n", op.Method(), tBufBody))
// add header parameters
for _, p := range tParams {
if p.In == "header" {
@ -209,7 +210,7 @@ func (e Encoder) Funcs(tag string, operations []*openapi.Operation) string {
tQBuf.WriteString(" q := req.URL.Query()\n")
for _, p := range tParams {
if p.In == "query" {
tQBuf.WriteString(fmt.Sprintf(" q.Add(\"%v\", joinIfArray(%v))\n", p.Name, NormalizeName(p.Name)))
tQBuf.WriteString(fmt.Sprintf(" addQueryParameter(&q, \"%v\", joinIfArray(%v))\n", p.Name, NormalizeName(p.Name)))
tQBufHasData = true
}
}

View File

@ -336,6 +336,10 @@ func (s Schema) GoType() string {
tRet = "bool"
case "array":
tRet = fmt.Sprintf("[]%v", s.Items.GoType())
case "object":
// should not happen, but in order to not to break things
// return an empty struct
tRet = "struct{/*object*/}"
case "": // arrays may not be tagged as such. deduce from the items element:
if s.Items != nil {
tRet = fmt.Sprintf("[]%v", s.Items.GoType())