// 用中间件的方式挂载InternalClient
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
if c.Request().Method == http.MethodGet {
return next(c)
}
var body base.BaseRequestBody
err := utils.CopyAndBindRequestBody(c.Request(), &body)
if err != nil {
return err
}
if body.Wg.ClientRequest == nil {
body.Wg.ClientRequest = &base.ClientRequest{
Method: c.Request().Method,
RequestURI: c.Request().RequestURI,
Headers: map[string]string{},
}
} else {
for name, value := range body.Wg.ClientRequest.Headers {
c.Request().Header.Set(name, value)
}
}
// 用来追踪调用过程
reqId := c.Request().Header.Get("x-request-id")
// 构建InternalClient
internalClient := base.InternalClientFactoryCall(map[string]string{"x-request-id": reqId}, body.Wg.ClientRequest, body.Wg.User)
internalClient.Queries = internalQueries
internalClient.Mutations = internalMutations
brc := &base.BaseRequestContext{
Context: c,
User: body.Wg.User,
InternalClient: internalClient,
}
return next(brc)
}
})
func PostResolve(hook *base.HookRequest, body generated.Lesson0301__SimpleBody) (res generated.Lesson0301__SimpleBody, err error) {
hook.Logger().Info("PostResolve")
// 通过ExecuteInternalRequestQueries方法调用QUERY OPERATION,其中
// [OP_PATH]为OPERATION的路径,合成规则为DIC__OPName,例如:Lesson0301__Internal
// [OP_PATH]Input 为入参对象
// [OP_PATH]ResponseData为响应对象
todoRes, _ := plugins.ExecuteInternalRequestQueries[generated.Lesson0301__InternalInput, generated.Lesson0301__InternalResponseData]
(hook.InternalClient, generated.Lesson0301__Internal,
generated.Lesson0301__InternalInput{
Id: 2,
})
fmt.Println(todoRes)
return body, nil
}