2021-01-17 21:46:25 +08:00
|
|
|
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
2018-12-31 00:22:18 +08:00
|
|
|
//
|
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
2019-02-02 16:18:25 +08:00
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2018-12-31 00:22:18 +08:00
|
|
|
|
|
|
|
|
package ghttp_test
|
|
|
|
|
|
|
|
|
|
import (
|
2020-08-14 20:02:52 +08:00
|
|
|
"bytes"
|
2025-03-09 11:17:41 +08:00
|
|
|
"context"
|
2019-06-19 09:06:52 +08:00
|
|
|
"fmt"
|
2023-08-01 21:15:28 +08:00
|
|
|
"io"
|
2019-07-03 22:09:35 +08:00
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2021-10-11 21:41:56 +08:00
|
|
|
"github.com/gogf/gf/v2/encoding/gjson"
|
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
|
|
|
"github.com/gogf/gf/v2/net/ghttp"
|
|
|
|
|
"github.com/gogf/gf/v2/test/gtest"
|
2022-02-22 14:12:09 +08:00
|
|
|
"github.com/gogf/gf/v2/util/guid"
|
2018-12-31 00:22:18 +08:00
|
|
|
)
|
|
|
|
|
|
2019-02-27 21:17:56 +08:00
|
|
|
func Test_Params_Basic(t *testing.T) {
|
2019-06-19 09:06:52 +08:00
|
|
|
type User struct {
|
|
|
|
|
Id int
|
|
|
|
|
Name string
|
2022-11-14 19:57:39 +08:00
|
|
|
Pass1 string `p:"password1"`
|
|
|
|
|
Pass2 string `p:"password2"`
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2019-10-01 09:06:35 +08:00
|
|
|
// GET
|
2019-06-19 09:06:52 +08:00
|
|
|
s.BindHandler("/get", func(r *ghttp.Request) {
|
2019-09-19 20:19:07 +08:00
|
|
|
if r.GetQuery("array") != nil {
|
|
|
|
|
r.Response.Write(r.GetQuery("array"))
|
|
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
if r.GetQuery("slice") != nil {
|
|
|
|
|
r.Response.Write(r.GetQuery("slice"))
|
|
|
|
|
}
|
|
|
|
|
if r.GetQuery("bool") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("bool").Bool())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("float32") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("float32").Float32())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("float64") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("float64").Float64())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("int") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("int").Int())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("uint") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("uint").Uint())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("string") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetQuery("string").String())
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2019-09-19 23:23:41 +08:00
|
|
|
if r.GetQuery("map") != nil {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(r.GetQueryMap()["map"].(map[string]any)["b"])
|
2019-09-19 23:23:41 +08:00
|
|
|
}
|
|
|
|
|
if r.GetQuery("a") != nil {
|
|
|
|
|
r.Response.Write(r.GetQueryMapStrStr()["a"])
|
|
|
|
|
}
|
2019-06-19 09:06:52 +08:00
|
|
|
})
|
2019-10-01 09:06:35 +08:00
|
|
|
// PUT
|
2019-09-18 23:20:45 +08:00
|
|
|
s.BindHandler("/put", func(r *ghttp.Request) {
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("array") != nil {
|
|
|
|
|
r.Response.Write(r.Get("array"))
|
2019-09-19 20:19:07 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("slice") != nil {
|
|
|
|
|
r.Response.Write(r.Get("slice"))
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("bool") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("bool").Bool())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("float32") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float32").Float32())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("float64") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float64").Float64())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("int") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("int").Int())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("uint") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("uint").Uint())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("string") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("string").String())
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("map") != nil {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(r.GetMap()["map"].(map[string]any)["b"])
|
2019-09-18 23:20:45 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("a") != nil {
|
|
|
|
|
r.Response.Write(r.GetMapStrStr()["a"])
|
2019-09-19 23:23:41 +08:00
|
|
|
}
|
2019-09-18 23:20:45 +08:00
|
|
|
})
|
2021-09-19 23:13:53 +08:00
|
|
|
|
2019-10-01 09:06:35 +08:00
|
|
|
// DELETE
|
|
|
|
|
s.BindHandler("/delete", func(r *ghttp.Request) {
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("array") != nil {
|
|
|
|
|
r.Response.Write(r.Get("array"))
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("slice") != nil {
|
|
|
|
|
r.Response.Write(r.Get("slice"))
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("bool") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("bool").Bool())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("float32") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float32").Float32())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("float64") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float64").Float64())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("int") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("int").Int())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("uint") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("uint").Uint())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("string") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("string").String())
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("map") != nil {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(r.GetMap()["map"].(map[string]any)["b"])
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
2019-11-29 22:02:19 +08:00
|
|
|
if r.Get("a") != nil {
|
|
|
|
|
r.Response.Write(r.GetMapStrStr()["a"])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
// PATCH
|
|
|
|
|
s.BindHandler("/patch", func(r *ghttp.Request) {
|
|
|
|
|
if r.Get("array") != nil {
|
|
|
|
|
r.Response.Write(r.Get("array"))
|
|
|
|
|
}
|
|
|
|
|
if r.Get("slice") != nil {
|
|
|
|
|
r.Response.Write(r.Get("slice"))
|
|
|
|
|
}
|
|
|
|
|
if r.Get("bool") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("bool").Bool())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("float32") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float32").Float32())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("float64") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("float64").Float64())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("int") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("int").Int())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("uint") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("uint").Uint())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("string") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.Get("string").String())
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("map") != nil {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(r.GetMap()["map"].(map[string]any)["b"])
|
2019-11-29 22:02:19 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("a") != nil {
|
|
|
|
|
r.Response.Write(r.GetMapStrStr()["a"])
|
2019-10-01 09:06:35 +08:00
|
|
|
}
|
|
|
|
|
})
|
2019-11-30 09:42:07 +08:00
|
|
|
// Form
|
|
|
|
|
s.BindHandler("/form", func(r *ghttp.Request) {
|
|
|
|
|
if r.Get("array") != nil {
|
|
|
|
|
r.Response.Write(r.GetForm("array"))
|
|
|
|
|
}
|
|
|
|
|
if r.Get("slice") != nil {
|
|
|
|
|
r.Response.Write(r.GetForm("slice"))
|
|
|
|
|
}
|
|
|
|
|
if r.Get("bool") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("bool").Bool())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("float32") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("float32").Float32())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("float64") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("float64").Float64())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("int") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("int").Int())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("uint") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("uint").Uint())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("string") != nil {
|
2021-09-27 21:27:24 +08:00
|
|
|
r.Response.Write(r.GetForm("string").String())
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("map") != nil {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(r.GetFormMap()["map"].(map[string]any)["b"])
|
2019-11-30 09:42:07 +08:00
|
|
|
}
|
|
|
|
|
if r.Get("a") != nil {
|
|
|
|
|
r.Response.Write(r.GetFormMapStrStr()["a"])
|
|
|
|
|
}
|
|
|
|
|
})
|
2019-06-19 09:06:52 +08:00
|
|
|
s.BindHandler("/map", func(r *ghttp.Request) {
|
|
|
|
|
if m := r.GetQueryMap(); len(m) > 0 {
|
|
|
|
|
r.Response.Write(m["name"])
|
2019-11-29 22:02:19 +08:00
|
|
|
return
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2020-01-20 20:32:39 +08:00
|
|
|
if m := r.GetMap(); len(m) > 0 {
|
2019-06-19 09:06:52 +08:00
|
|
|
r.Response.Write(m["name"])
|
2019-11-29 22:02:19 +08:00
|
|
|
return
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/raw", func(r *ghttp.Request) {
|
2021-09-27 22:47:39 +08:00
|
|
|
r.Response.Write(r.GetBody())
|
2019-06-19 09:06:52 +08:00
|
|
|
})
|
|
|
|
|
s.BindHandler("/json", func(r *ghttp.Request) {
|
2019-09-24 20:39:00 +08:00
|
|
|
j, err := r.GetJson()
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.Response.Write(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
r.Response.Write(j.Get("name"))
|
2019-06-19 09:06:52 +08:00
|
|
|
})
|
|
|
|
|
s.BindHandler("/struct", func(r *ghttp.Request) {
|
|
|
|
|
if m := r.GetQueryMap(); len(m) > 0 {
|
|
|
|
|
user := new(User)
|
2020-01-20 20:32:39 +08:00
|
|
|
r.GetQueryStruct(user)
|
2019-06-19 09:06:52 +08:00
|
|
|
r.Response.Write(user.Id, user.Name, user.Pass1, user.Pass2)
|
2019-11-29 22:02:19 +08:00
|
|
|
return
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
2020-01-20 20:32:39 +08:00
|
|
|
if m := r.GetMap(); len(m) > 0 {
|
2019-06-19 09:06:52 +08:00
|
|
|
user := new(User)
|
2020-01-20 20:32:39 +08:00
|
|
|
r.GetStruct(user)
|
2019-06-19 09:06:52 +08:00
|
|
|
r.Response.Write(user.Id, user.Name, user.Pass1, user.Pass2)
|
2019-11-29 22:02:19 +08:00
|
|
|
return
|
2019-06-19 09:06:52 +08:00
|
|
|
}
|
|
|
|
|
})
|
2019-10-01 09:33:26 +08:00
|
|
|
s.BindHandler("/struct-with-nil", func(r *ghttp.Request) {
|
|
|
|
|
user := (*User)(nil)
|
2020-01-20 20:32:39 +08:00
|
|
|
err := r.GetStruct(&user)
|
2019-10-01 09:33:26 +08:00
|
|
|
r.Response.Write(err)
|
|
|
|
|
})
|
2019-07-03 22:09:35 +08:00
|
|
|
s.BindHandler("/struct-with-base", func(r *ghttp.Request) {
|
|
|
|
|
type Base struct {
|
2022-11-14 19:57:39 +08:00
|
|
|
Pass1 string `p:"password1"`
|
|
|
|
|
Pass2 string `p:"password2"`
|
2019-07-03 22:09:35 +08:00
|
|
|
}
|
|
|
|
|
type UserWithBase1 struct {
|
|
|
|
|
Id int
|
|
|
|
|
Name string
|
|
|
|
|
Base
|
|
|
|
|
}
|
|
|
|
|
type UserWithBase2 struct {
|
|
|
|
|
Id int
|
|
|
|
|
Name string
|
|
|
|
|
Pass Base
|
|
|
|
|
}
|
2020-01-20 20:32:39 +08:00
|
|
|
if m := r.GetMap(); len(m) > 0 {
|
2019-07-03 22:09:35 +08:00
|
|
|
user1 := new(UserWithBase1)
|
|
|
|
|
user2 := new(UserWithBase2)
|
2020-01-20 20:32:39 +08:00
|
|
|
r.GetStruct(user1)
|
|
|
|
|
r.GetStruct(user2)
|
2019-07-03 22:09:35 +08:00
|
|
|
r.Response.Write(user1.Id, user1.Name, user1.Pass1, user1.Pass2)
|
|
|
|
|
r.Response.Write(user2.Id, user2.Name, user2.Pass.Pass1, user2.Pass.Pass2)
|
|
|
|
|
}
|
|
|
|
|
})
|
2019-12-04 13:55:08 +08:00
|
|
|
s.SetDumpRouterMap(false)
|
2019-06-19 09:06:52 +08:00
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
2019-02-28 23:57:20 +08:00
|
|
|
|
2019-10-09 00:33:58 +08:00
|
|
|
time.Sleep(100 * time.Millisecond)
|
2020-03-19 22:56:12 +08:00
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2020-11-25 16:40:45 +08:00
|
|
|
client := g.Client()
|
2022-02-22 14:12:09 +08:00
|
|
|
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
|
2019-06-19 09:06:52 +08:00
|
|
|
// GET
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/get", "array[]=1&array[]=2"), `["1","2"]`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "slice=1&slice=2"), `2`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "bool=1"), `true`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "bool=0"), `false`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "float32=0.11"), `0.11`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "float64=0.22"), `0.22`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "int=-10000"), `-10000`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "int=10000"), `10000`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "uint=10000"), `10000`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "uint=9"), `9`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "string=key"), `key`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "map[a]=1&map[b]=2"), `2`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/get", "a=1&b=2"), `1`)
|
2018-12-31 00:50:55 +08:00
|
|
|
|
2019-09-18 23:20:45 +08:00
|
|
|
// PUT
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PutContent(ctx, "/put", "array[]=1&array[]=2"), `["1","2"]`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "slice=1&slice=2"), `2`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "bool=1"), `true`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "bool=0"), `false`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "float32=0.11"), `0.11`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "float64=0.22"), `0.22`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "int=-10000"), `-10000`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "int=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "uint=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "uint=9"), `9`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "string=key"), `key`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "map[a]=1&map[b]=2"), `2`)
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/put", "a=1&b=2"), `1`)
|
2019-09-18 23:20:45 +08:00
|
|
|
|
2019-10-01 09:06:35 +08:00
|
|
|
// DELETE
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "array[]=1&array[]=2"), `["1","2"]`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "slice=1&slice=2"), `2`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "bool=1"), `true`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "bool=0"), `false`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "float32=0.11"), `0.11`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "float64=0.22"), `0.22`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "int=-10000"), `-10000`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "int=10000"), `10000`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "uint=10000"), `10000`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "uint=9"), `9`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "string=key"), `key`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "map[a]=1&map[b]=2"), `2`)
|
|
|
|
|
t.Assert(client.DeleteContent(ctx, "/delete", "a=1&b=2"), `1`)
|
2019-10-01 09:06:35 +08:00
|
|
|
|
2019-11-29 22:02:19 +08:00
|
|
|
// PATCH
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "array[]=1&array[]=2"), `["1","2"]`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "slice=1&slice=2"), `2`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "bool=1"), `true`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "bool=0"), `false`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "float32=0.11"), `0.11`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "float64=0.22"), `0.22`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "int=-10000"), `-10000`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "int=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "uint=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "uint=9"), `9`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "string=key"), `key`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "map[a]=1&map[b]=2"), `2`)
|
|
|
|
|
t.Assert(client.PatchContent(ctx, "/patch", "a=1&b=2"), `1`)
|
2019-11-29 22:02:19 +08:00
|
|
|
|
2019-11-30 09:42:07 +08:00
|
|
|
// Form
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PostContent(ctx, "/form", "array[]=1&array[]=2"), `["1","2"]`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "slice=1&slice=2"), `2`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "bool=1"), `true`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "bool=0"), `false`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "float32=0.11"), `0.11`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "float64=0.22"), `0.22`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "int=-10000"), `-10000`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "int=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "uint=10000"), `10000`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "uint=9"), `9`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "string=key"), `key`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "map[a]=1&map[b]=2"), `2`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form", "a=1&b=2"), `1`)
|
2019-11-30 09:42:07 +08:00
|
|
|
|
2019-06-19 09:06:52 +08:00
|
|
|
// Map
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/map", "id=1&name=john"), `john`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/map", "id=1&name=john"), `john`)
|
2018-12-31 00:50:55 +08:00
|
|
|
|
2019-06-19 09:06:52 +08:00
|
|
|
// Raw
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PutContent(ctx, "/raw", "id=1&name=john"), `id=1&name=john`)
|
2018-12-31 00:50:55 +08:00
|
|
|
|
2019-06-19 09:06:52 +08:00
|
|
|
// Json
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PostContent(ctx, "/json", `{"id":1, "name":"john"}`), `john`)
|
2018-12-31 00:50:55 +08:00
|
|
|
|
2019-06-19 09:06:52 +08:00
|
|
|
// Struct
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/struct", `id=1&name=john&password1=123&password2=456`), `1john123456`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/struct", `id=1&name=john&password1=123&password2=456`), `1john123456`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/struct-with-nil", ``), ``)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/struct-with-base", `id=1&name=john&password1=123&password2=456`), "1john1234561john")
|
2019-06-19 09:06:52 +08:00
|
|
|
})
|
2018-12-31 00:22:18 +08:00
|
|
|
}
|
2019-12-01 14:07:36 +08:00
|
|
|
|
2020-07-21 10:17:31 +08:00
|
|
|
func Test_Params_Header(t *testing.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2020-07-21 10:17:31 +08:00
|
|
|
s.BindHandler("/header", func(r *ghttp.Request) {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
r.Response.Write(map[string]any{
|
2025-03-25 20:42:30 +08:00
|
|
|
"without-def": r.GetHeader("no-header"),
|
|
|
|
|
"with-def": r.GetHeader("no-header", "my-default"),
|
|
|
|
|
"x-custom-with": r.GetHeader("x-custom", "my-default"),
|
|
|
|
|
})
|
2020-07-21 10:17:31 +08:00
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2020-11-25 16:40:45 +08:00
|
|
|
client := g.Client()
|
2020-07-21 10:17:31 +08:00
|
|
|
client.SetPrefix(prefix)
|
2025-03-25 20:42:30 +08:00
|
|
|
client.SetHeader("x-custom", "custom-value")
|
2020-07-21 10:17:31 +08:00
|
|
|
|
2025-03-25 20:42:30 +08:00
|
|
|
resp := client.GetContent(ctx, "/header")
|
|
|
|
|
t.Assert(gjson.New(resp).Map(), g.Map{
|
|
|
|
|
"without-def": "",
|
|
|
|
|
"with-def": "my-default",
|
|
|
|
|
"x-custom-with": "custom-value",
|
|
|
|
|
})
|
2020-07-21 10:17:31 +08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2020-01-22 20:28:42 +08:00
|
|
|
func Test_Params_SupportChars(t *testing.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2020-01-22 20:28:42 +08:00
|
|
|
s.BindHandler("/form-value", func(r *ghttp.Request) {
|
2020-10-22 15:16:31 +08:00
|
|
|
r.Response.Write(r.GetForm("test-value"))
|
2020-01-22 20:28:42 +08:00
|
|
|
})
|
|
|
|
|
s.BindHandler("/form-array", func(r *ghttp.Request) {
|
2020-10-22 15:16:31 +08:00
|
|
|
r.Response.Write(r.GetForm("test-array"))
|
2020-01-22 20:28:42 +08:00
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
2020-03-19 22:56:12 +08:00
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2020-10-22 15:16:31 +08:00
|
|
|
c := g.Client()
|
2022-02-22 14:12:09 +08:00
|
|
|
c.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(c.PostContent(ctx, "/form-value", "test-value=100"), "100")
|
|
|
|
|
t.Assert(c.PostContent(ctx, "/form-array", "test-array[]=1&test-array[]=2"), `["1","2"]`)
|
2020-01-22 20:28:42 +08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-01 14:07:36 +08:00
|
|
|
func Test_Params_Priority(t *testing.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2019-12-01 14:07:36 +08:00
|
|
|
s.BindHandler("/query", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetQuery("a"))
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/form", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetForm("a"))
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/request", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.Get("a"))
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/request-map", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetMap(g.Map{
|
|
|
|
|
"a": 1,
|
|
|
|
|
"b": 2,
|
|
|
|
|
}))
|
|
|
|
|
})
|
2019-12-04 13:55:08 +08:00
|
|
|
s.SetDumpRouterMap(false)
|
2019-12-01 14:07:36 +08:00
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
2020-03-19 22:56:12 +08:00
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2020-11-25 16:40:45 +08:00
|
|
|
client := g.Client()
|
2019-12-01 14:07:36 +08:00
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/query?a=1", "a=100"), "100")
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/form?a=1", "a=100"), "100")
|
|
|
|
|
t.Assert(client.PutContent(ctx, "/form?a=1", "a=100"), "100")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/request?a=1", "a=100"), "100")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/request-map?a=1&b=2&c=3", "a=100&b=200&c=300"), `{"a":"100","b":"200"}`)
|
2019-12-01 14:07:36 +08:00
|
|
|
})
|
|
|
|
|
}
|
2020-04-23 20:10:10 +08:00
|
|
|
|
|
|
|
|
func Test_Params_GetRequestMap(t *testing.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2020-04-23 20:10:10 +08:00
|
|
|
s.BindHandler("/map", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetRequestMap())
|
|
|
|
|
})
|
2022-12-12 10:28:58 +08:00
|
|
|
s.BindHandler("/withKVMap", func(r *ghttp.Request) {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
m := r.GetRequestMap(map[string]any{"id": 2})
|
2022-12-12 10:28:58 +08:00
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/paramsMapWithKVMap", func(r *ghttp.Request) {
|
|
|
|
|
r.SetParam("name", "john")
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
m := r.GetRequestMap(map[string]any{"id": 2})
|
2022-12-12 10:28:58 +08:00
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/{name}.map", func(r *ghttp.Request) {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
m := r.GetRequestMap(map[string]any{"id": 2})
|
2022-12-12 10:28:58 +08:00
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
})
|
2020-04-23 20:10:10 +08:00
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2020-11-25 16:40:45 +08:00
|
|
|
client := g.Client()
|
2020-04-23 20:10:10 +08:00
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(
|
2021-09-30 14:06:46 +08:00
|
|
|
client.PostContent(ctx,
|
2020-04-23 20:10:10 +08:00
|
|
|
"/map",
|
|
|
|
|
"time_end2020-04-18 16:11:58&returnmsg=Success&attach=",
|
|
|
|
|
),
|
|
|
|
|
`{"attach":"","returnmsg":"Success"}`,
|
|
|
|
|
)
|
2022-12-12 10:28:58 +08:00
|
|
|
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/john.map", "name=john"), 2)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/withKVMap", "name=john"), 2)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/paramsMapWithKVMap"), 2)
|
|
|
|
|
|
|
|
|
|
client.SetContentType("application/json")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/withKVMap", "name=john"), 2)
|
2020-04-23 20:10:10 +08:00
|
|
|
})
|
|
|
|
|
}
|
2020-08-14 20:02:52 +08:00
|
|
|
|
|
|
|
|
func Test_Params_Modify(t *testing.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2020-08-14 20:02:52 +08:00
|
|
|
s.BindHandler("/param/modify", func(r *ghttp.Request) {
|
|
|
|
|
param := r.GetMap()
|
|
|
|
|
param["id"] = 2
|
|
|
|
|
paramBytes, err := gjson.Encode(param)
|
|
|
|
|
if err != nil {
|
|
|
|
|
r.Response.Write(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
2023-08-01 21:15:28 +08:00
|
|
|
r.Request.Body = io.NopCloser(bytes.NewReader(paramBytes))
|
2020-08-14 20:02:52 +08:00
|
|
|
r.ReloadParam()
|
|
|
|
|
r.Response.Write(r.GetMap())
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2020-11-25 16:40:45 +08:00
|
|
|
client := g.Client()
|
2020-08-14 20:02:52 +08:00
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(
|
2021-09-30 14:06:46 +08:00
|
|
|
client.PostContent(ctx,
|
2020-08-14 20:02:52 +08:00
|
|
|
"/param/modify",
|
|
|
|
|
`{"id":1}`,
|
|
|
|
|
),
|
|
|
|
|
`{"id":2}`,
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-11-08 15:44:04 +08:00
|
|
|
|
2020-11-08 16:21:09 +08:00
|
|
|
func Test_Params_Parse_DefaultValueTag(t *testing.T) {
|
|
|
|
|
type T struct {
|
|
|
|
|
Name string `d:"john"`
|
|
|
|
|
Score float32 `d:"60"`
|
|
|
|
|
}
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2020-11-08 16:21:09 +08:00
|
|
|
s.BindHandler("/parse", func(r *ghttp.Request) {
|
|
|
|
|
var t *T
|
|
|
|
|
if err := r.Parse(&t); err != nil {
|
|
|
|
|
r.Response.WriteExit(err)
|
|
|
|
|
}
|
|
|
|
|
r.Response.WriteExit(t)
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2020-11-08 16:21:09 +08:00
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.PostContent(ctx, "/parse"), `{"Name":"john","Score":60}`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/parse", `{"name":"smith"}`), `{"Name":"smith","Score":60}`)
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/parse", `{"name":"smith", "score":100}`), `{"Name":"smith","Score":100}`)
|
2020-11-08 16:21:09 +08:00
|
|
|
})
|
|
|
|
|
}
|
2021-06-02 21:12:27 +08:00
|
|
|
|
|
|
|
|
func Test_Params_Parse_Validation(t *testing.T) {
|
|
|
|
|
type RegisterReq struct {
|
2021-11-14 21:00:34 +08:00
|
|
|
Name string `p:"username" v:"required|length:6,30#请输入账号|账号长度为{min}到{max}位"`
|
2021-06-02 21:12:27 +08:00
|
|
|
Pass string `p:"password1" v:"required|length:6,30#请输入密码|密码长度不够"`
|
|
|
|
|
Pass2 string `p:"password2" v:"required|length:6,30|same:password1#请确认密码|密码长度不够|两次密码不一致"`
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2021-06-02 21:12:27 +08:00
|
|
|
s.BindHandler("/parse", func(r *ghttp.Request) {
|
|
|
|
|
var req *RegisterReq
|
|
|
|
|
if err := r.Parse(&req); err != nil {
|
|
|
|
|
r.Response.Write(err)
|
|
|
|
|
} else {
|
|
|
|
|
r.Response.Write("ok")
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2021-06-02 21:12:27 +08:00
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
2022-02-17 21:14:11 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/parse"), `请输入账号`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/parse?name=john11&password1=123456&password2=123"), `密码长度不够`)
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/parse?name=john&password1=123456&password2=123456"), `账号长度为6到30位`)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/parse?name=john11&password1=123456&password2=123456"), `ok`)
|
2021-06-02 21:12:27 +08:00
|
|
|
})
|
|
|
|
|
}
|
2021-06-23 21:39:12 +08:00
|
|
|
|
|
|
|
|
func Test_Params_Parse_EmbeddedWithAliasName1(t *testing.T) {
|
|
|
|
|
// 获取内容列表
|
|
|
|
|
type ContentGetListInput struct {
|
|
|
|
|
Type string
|
|
|
|
|
CategoryId uint
|
|
|
|
|
Page int
|
|
|
|
|
Size int
|
|
|
|
|
Sort int
|
|
|
|
|
UserId uint
|
|
|
|
|
}
|
|
|
|
|
// 获取内容列表
|
|
|
|
|
type ContentGetListReq struct {
|
|
|
|
|
ContentGetListInput
|
|
|
|
|
CategoryId uint `p:"cate"`
|
|
|
|
|
Page int `d:"1" v:"min:0#分页号码错误"`
|
|
|
|
|
Size int `d:"10" v:"max:50#分页数量最大50条"`
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2021-06-23 21:39:12 +08:00
|
|
|
s.BindHandler("/parse", func(r *ghttp.Request) {
|
|
|
|
|
var req *ContentGetListReq
|
|
|
|
|
if err := r.Parse(&req); err != nil {
|
|
|
|
|
r.Response.Write(err)
|
|
|
|
|
} else {
|
|
|
|
|
r.Response.Write(req.ContentGetListInput)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2021-06-23 21:39:12 +08:00
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/parse?cate=1&page=2&size=10"), `{"Type":"","CategoryId":0,"Page":2,"Size":10,"Sort":0,"UserId":0}`)
|
2021-06-23 21:39:12 +08:00
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_Parse_EmbeddedWithAliasName2(t *testing.T) {
|
|
|
|
|
// 获取内容列表
|
|
|
|
|
type ContentGetListInput struct {
|
|
|
|
|
Type string
|
|
|
|
|
CategoryId uint `p:"cate"`
|
|
|
|
|
Page int
|
|
|
|
|
Size int
|
|
|
|
|
Sort int
|
|
|
|
|
UserId uint
|
|
|
|
|
}
|
|
|
|
|
// 获取内容列表
|
|
|
|
|
type ContentGetListReq struct {
|
|
|
|
|
ContentGetListInput
|
|
|
|
|
CategoryId uint `p:"cate"`
|
|
|
|
|
Page int `d:"1" v:"min:0#分页号码错误"`
|
|
|
|
|
Size int `d:"10" v:"max:50#分页数量最大50条"`
|
|
|
|
|
}
|
|
|
|
|
|
2022-02-22 14:12:09 +08:00
|
|
|
s := g.Server(guid.S())
|
2021-06-23 21:39:12 +08:00
|
|
|
s.BindHandler("/parse", func(r *ghttp.Request) {
|
|
|
|
|
var req *ContentGetListReq
|
|
|
|
|
if err := r.Parse(&req); err != nil {
|
|
|
|
|
r.Response.Write(err)
|
|
|
|
|
} else {
|
|
|
|
|
r.Response.Write(req.ContentGetListInput)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
2022-02-22 14:12:09 +08:00
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
2021-06-23 21:39:12 +08:00
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
2021-09-30 14:06:46 +08:00
|
|
|
t.Assert(client.GetContent(ctx, "/parse?cate=1&page=2&size=10"), `{"Type":"","CategoryId":1,"Page":2,"Size":10,"Sort":0,"UserId":0}`)
|
2021-06-23 21:39:12 +08:00
|
|
|
})
|
|
|
|
|
}
|
2022-12-12 10:28:58 +08:00
|
|
|
|
|
|
|
|
func Test_Params_GetParam(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetParam("key", "val"))
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/"), "val")
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_SetQuery(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/SetQuery", func(r *ghttp.Request) {
|
|
|
|
|
r.SetQuery("a", 100)
|
|
|
|
|
r.Response.Write(r.GetQuery("a"))
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/SetQuery"), "100")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/SetQuery?a=1"), "100")
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetQuery(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetQuery", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetQuery("a", 200))
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQuery"), 200)
|
|
|
|
|
t.Assert(client.SetContentType("application/json").GetContent(ctx, "/GetQuery", "a=100"), 100)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetQueryMap(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetQueryMap", func(r *ghttp.Request) {
|
|
|
|
|
if m := r.GetQueryMap(); len(m) > 0 {
|
|
|
|
|
r.Response.Write(m["name"])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/GetQueryMapWithKVMap", func(r *ghttp.Request) {
|
refactor: interface{} to any and reflect.Ptr to reflect.Pointer (#4395)
This pull request standardizes the use of the Go 1.18+ `any` type alias
instead of `interface{}` throughout the codebase. The change improves
code readability and aligns with modern Go best practices. The update
touches many files, including core data structures, code generation
templates, logging utilities, and test data, ensuring consistency across
all usages.
**Type alias migration to `any`:**
* Replaced all instances of `interface{}` with `any` in core data
structures such as `garray` and in generated model structs (e.g.,
`TableUser`, `User1`, `User2`) to modernize type usage.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[3]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[4]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[5]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[6]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
* Updated function signatures, method parameters, and return types from
`interface{}` to `any` in various parts of the codebase, including code
generation, service logic, and logging utilities (e.g., `mlog`).
[[1]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[2]](diffhunk://#diff-2b1953fb78cf3593d8c2c7d911e95b65fd0b847c30ed0b4d167d16fe6d781235L54-R74)
[[3]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[4]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
[[5]](diffhunk://#diff-c5d51d56f487779a2b6207c7ad26c7a20bbadcc846ce094fe60ab4cabff58c51L107-R107)
[[6]](diffhunk://#diff-f96e6a9fdb416eb1804ceaba1fe0ac637bff22c43837f8bb849c2366ce72d4a1L116-R121)
[[7]](diffhunk://#diff-f94c83a1b08ae060d9346f4a6031fc4a7b9a0b894e02d9afaa09018b6598eac0L112-R112)
[[8]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L36-R36)
[[9]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L74-R74)
[[10]](diffhunk://#diff-748b11dbe8828dd4c040ec23cae0b8fe57ecf0a2d1b7694ea39102294e633c64L96-R96)
**Generated code and templates:**
* Adjusted generated files and code generation templates to output `any`
instead of `interface{}` for relevant struct fields and function
signatures, ensuring that new code generation aligns with the updated
convention.
[[1]](diffhunk://#diff-6c19859cb32c7516ea95ddc8f8235460818eb2f24d2204308e0d9e1b19e7d90fL15-R19)
[[2]](diffhunk://#diff-a15ba2f5e830b4833c47b902515a4f9e5a4f83a3707698f3229b307ec3776b41L15-R18)
[[3]](diffhunk://#diff-52e0837e84d49221d1b810d88fdf78221f36cffcd664fb42f8aba49a79b974dcL15-R19)
[[4]](diffhunk://#diff-11c3457d1a23a4ca6ecd00d6b856289774936b6a708384cf03aff164044e7546L15-R19)
[[5]](diffhunk://#diff-2cff9cf8e6a0cc34087326d8c8149c3bbaf74c76fdbdf5a73daed13cc04249e1L15-R19)
[[6]](diffhunk://#diff-175edfeea54490b8fe4e18ffcbea5835efaf8f0b8acf623359073987cae7eb76L48-R55)
[[7]](diffhunk://#diff-e001b7a4b63603b9b14f00de78a4d570bb76c5f57d856a24643f071032e12356L66-R73)
[[8]](diffhunk://#diff-5582954e8a9983988dc8854ad82067fb2ac6269b988e07357ad8db1dfec5f1a0L39-R41)
**Container and utility updates:**
* Refactored the `garray` container implementation and related
constructors/methods to use `[]any` instead of `[]interface{}`, along
with corresponding function signatures.
[[1]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L31-R31)
[[2]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L52-R52)
[[3]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L62-R62)
[[4]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L73-R86)
[[5]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L96-R97)
[[6]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L107-R114)
[[7]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L124-R124)
[[8]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L135-R143)
[[9]](diffhunk://#diff-3a1259e160a4dfa5fe49dfe739fbdb986c0d0a2220a709882ea48d3ae1b8f911L167-R167)
These changes collectively modernize the codebase and prepare it for
future Go developments by using the idiomatic `any` type.
2025-08-28 16:53:19 +08:00
|
|
|
if m := r.GetQueryMap(map[string]any{"id": 1}); len(m) > 0 {
|
2022-12-12 10:28:58 +08:00
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
client.SetContentType("application/json")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMap", "id=1&name=john"), `john`)
|
|
|
|
|
})
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap"), 1)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "name=john"), 1)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "id=2&name=john"), 2)
|
|
|
|
|
client.SetContentType("application/json")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "name=john"), 1)
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapWithKVMap", "id=2&name=john"), 2)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetQueryMapStrStr(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetQueryMapStrStr", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetQueryMapStrStr())
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapStrStr"), "")
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetQueryMapStrVar(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetQueryMapStrVar", func(r *ghttp.Request) {
|
|
|
|
|
m := r.GetQueryMapStrVar()
|
|
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapStrVar"), "")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetQueryMapStrVar", "id=1"), 1)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetRequest(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetRequest", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetRequest("id"))
|
|
|
|
|
})
|
|
|
|
|
s.BindHandler("/GetRequestWithDef", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetRequest("id", 2))
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetRequestWithDef"), 2)
|
|
|
|
|
|
|
|
|
|
client.SetContentType("application/json")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetRequest", "id=1"), 1)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetRequestMapStrStr(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetRequestMapStrStr", func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Write(r.GetRequestMapStrStr())
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetRequestMapStrStr"), "")
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_Params_GetRequestMapStrVar(t *testing.T) {
|
|
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.BindHandler("/GetRequestMapStrVar", func(r *ghttp.Request) {
|
|
|
|
|
m := r.GetRequestMapStrVar()
|
|
|
|
|
r.Response.Write(m["id"])
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
prefix := fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort())
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(prefix)
|
|
|
|
|
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetRequestMapStrVar"), "")
|
|
|
|
|
t.Assert(client.GetContent(ctx, "/GetRequestMapStrVar", "id=1"), 1)
|
|
|
|
|
})
|
|
|
|
|
}
|
2025-03-09 11:17:41 +08:00
|
|
|
|
|
|
|
|
type GetMetaTagReq struct {
|
|
|
|
|
g.Meta `path:"/test" method:"post" summary:"meta_tag" tags:"meta"`
|
|
|
|
|
Name string
|
|
|
|
|
}
|
|
|
|
|
type GetMetaTagRes struct{}
|
|
|
|
|
|
|
|
|
|
type GetMetaTagSt struct{}
|
|
|
|
|
|
|
|
|
|
func (r GetMetaTagSt) PostTest(ctx context.Context, req *GetMetaTagReq) (*GetMetaTagRes, error) {
|
|
|
|
|
return &GetMetaTagRes{}, nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-03-12 21:55:35 +08:00
|
|
|
func TestRequest_GetServeHandler_GetMetaTag(t *testing.T) {
|
2025-03-09 11:17:41 +08:00
|
|
|
s := g.Server(guid.S())
|
|
|
|
|
s.Use(func(r *ghttp.Request) {
|
|
|
|
|
r.Response.Writef(
|
|
|
|
|
"summary:%s,method:%s",
|
2025-03-12 21:55:35 +08:00
|
|
|
r.GetServeHandler().GetMetaTag("summary"),
|
|
|
|
|
r.GetServeHandler().GetMetaTag("method"),
|
2025-03-09 11:17:41 +08:00
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
s.Group("/", func(grp *ghttp.RouterGroup) {
|
|
|
|
|
grp.Bind(GetMetaTagSt{})
|
|
|
|
|
})
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
time.Sleep(1000 * time.Millisecond)
|
|
|
|
|
|
|
|
|
|
s.SetDumpRouterMap(false)
|
|
|
|
|
s.Start()
|
|
|
|
|
defer s.Shutdown()
|
|
|
|
|
time.Sleep(100 * time.Millisecond)
|
|
|
|
|
|
|
|
|
|
gtest.C(t, func(t *gtest.T) {
|
|
|
|
|
client := g.Client()
|
|
|
|
|
client.SetPrefix(fmt.Sprintf("http://127.0.0.1:%d", s.GetListenedPort()))
|
|
|
|
|
t.Assert(client.PostContent(ctx, "/test", "name=john"), "summary:meta_tag,method:post")
|
|
|
|
|
})
|
|
|
|
|
}
|