我想制作一个验证API,以验证一组与特定规则有关的json请求。为此,我只想使用一个端点并调用与特定json结构相对应的函数。我知道go中没有方法重载,所以我很困惑。
...
type requestBodyA struct {
SomeField string `json:"someField"`
SomeOtherField string `json:"someOtherField"`
}
type requestBodyB struct {
SomeDifferentField string `json:"someDifferentField"`
SomeOtherDifferentField string `json:"someOtherDifferentField"`
}
type ValidationService interface {
ValidateRequest(ctx context.Context, s string) (err error)
}
type basicValidationService struct{}
...
因此,为了验证许多不同的json请求,为每个json请求创建结构更好吗?还是应该动态创建这些?如果我只有一个端点,怎么知道发送哪种请求?
答案 0 :(得分:1)
如果您有一个必须接受不同JSON类型的终结点/ rpc,则需要告诉它如何以某种方式区分它们。一种选择是像这样:
type request struct {
bodyA *requestBodyA
bodyB *requestBodyB
}
然后,将这些字段适当地填充到容器JSON对象中。如果存在json
键,则bodyA
模块将仅填充bodyA
,否则将其保留为nil
,依此类推。
这是一个更完整的示例:
type RequestBodyFoo struct {
Name string
Balance float64
}
type RequestBodyBar struct {
Id int
Ref int
}
type Request struct {
Foo *RequestBodyFoo
Bar *RequestBodyBar
}
func (r *Request) Show() {
if r.Foo != nil {
fmt.Println("Request has Foo:", *r.Foo)
}
if r.Bar != nil {
fmt.Println("Request has Bar:", *r.Bar)
}
}
func main() {
bb := []byte(`
{
"Foo": {"Name": "joe", "balance": 4591.25}
}
`)
var req Request
if err := json.Unmarshal(bb, &req); err != nil {
panic(err)
}
req.Show()
var req2 Request
bb = []byte(`
{
"Bar": {"Id": 128992, "Ref": 801472}
}
`)
if err := json.Unmarshal(bb, &req2); err != nil {
panic(err)
}
req2.Show()
}
另一种选择是使用地图更动态地执行此操作,但是上述方法可能就足够了。