unary_handler.go 1.2 KB

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