unary_handler.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package handler
  2. import (
  3. "context"
  4. "git.ikuban.com/server/kratos-utils/v2/http/middleware"
  5. "git.ikuban.com/server/kratos-utils/v2/http/reply"
  6. "github.com/go-kratos/kratos/v2/transport/http"
  7. "google.golang.org/grpc"
  8. )
  9. func unaryHandler(srv any, method grpc.MethodDesc, option *middleware.Option) http.HandlerFunc {
  10. return func(ctx http.Context) error {
  11. http.SetOperation(ctx, option.Path)
  12. dec := func(in any) error {
  13. if err := ctx.Bind(&in); err != nil {
  14. return err
  15. }
  16. if err := ctx.BindQuery(&in); err != nil {
  17. return err
  18. }
  19. return nil
  20. }
  21. httpCtx := ctx
  22. interceptor := func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
  23. ctx = middleware.NewOptionContext(ctx, option)
  24. h := httpCtx.Middleware(func(ctx context.Context, req interface{}) (interface{}, error) {
  25. return handler(ctx, req)
  26. })
  27. return h(ctx, req)
  28. }
  29. out, err := method.Handler(srv, ctx, dec, interceptor)
  30. if err != nil {
  31. return err
  32. }
  33. success := &reply.SuccessReply{
  34. Code: 0,
  35. }
  36. if out != nil {
  37. success.Data = out
  38. }
  39. return ctx.Result(200, success)
  40. }
  41. }