登录
首页 >  Golang >  Go问答

go-micro wrappers的问题

来源:SegmentFault

时间:2023-01-23 09:39:52 361浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《go-micro wrappers的问题》,介绍一下微服务、中间件、go、micro,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

如文档里提到的:
这里的

server.Request
参数除了能获取服务名、方法名外,并不能获取
Header
Body
的数据,作为一个中间件使用,怎样才能拦截到http数据?

func logWrapper(fn server.HandlerFunc) server.HandlerFunc {
    return func(ctx context.Context, req server.Request, rsp interface{}) error {
        fmt.Printf("[%v] server request: %s", time.Now(), req.Endpoint())
        
        fmt.Println(req.Header())//打印结果:map[]
        
        return fn(ctx, req, rsp)
    }
}

server.Request
源码是这样的

// Request is a synchronous request interface  
type Request interface {  
   // Service name requested  
  Service() string  
  // The action requested  
  Method() string  
  // Endpoint name requested  
  Endpoint() string  
  // Content type provided  
  ContentType() string  
  // Header of the request  
  Header() map\[string\]string  
  // Body is the initial decoded value  
  Body() interface{}  
   // Read the undecoded request body  
  Read() (\[\]byte, error)  
   // The encoded message stream  
  Codec() codec.Reader  
  // Indicates whether its a stream  
  Stream() bool  
}

正确答案

func logWrapper(fn server.HandlerFunc) server.HandlerFunc {
    return func(ctx context.Context, req server.Request, rsp interface{}) error {
        //开始不知道req.Body()是个什么东西,虽然能print出东西来,直到typeof后才发现原来它是*go_api.Request
        //fmt.Println(reflect.TypeOf(req.Body()))//*go_api.Request
  
        //既然知道它的类型,那就好办了
        request:=req.Body().(*go_api.Request)
        
        fmt.Println(request.Header)
        fmt.Println(request.Body)
        
        return fn(ctx, req, rsp)
    }
}

好了,本文到此结束,带大家了解了《go-micro wrappers的问题》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表