在golang中将元数据传递到上下文时出错

时间:2017-02-16 18:02:25

标签: go grpc

我正致力于处理GRPC请求。我试图将基于此代码示例的GRPC请求中的元数据传递到上下文中:https://github.com/go-kit/kit/blob/master/auth/jwt/transport.go#L47

(以防万一,contextKey说明可以在这里引用:https://medium.com/@matryer/context-keys-in-go-5312346a868d#.vn10llkse):

以下是我的代码:

type contextKey string

func (c contextKey) String() string {
    return string(c)
}

var Headers := metadata.New(map[string]string{"auth":"", "abc": "", "xyz" : ""})

func ToGRPCContext() grpctransport.RequestFunc {
    return func(ctx context.Context, md *metadata.MD) context.Context {
       for _, header := range Headers {
           val, ok := (*md)[header]
           if !ok {
               return ctx
           }
           if len(val) > 0 {
              ctx = context.WithValue(ctx, contextKey(header), val)
           }
       }
       return ctx
    }

}

我正在尝试读取元数据字段(标题)并将其传递给上下文。

我收到以下错误。 cannot use header (type []string) as type string in map indexcannot convert header (type []string) to type contextKey。我通过访问索引并执行类似val, ok := (*md)[header[0]]之类的操作来修复上述错误。但是,我想将地图的所有元素传递给上下文。

有关如何解决此问题的任何建议?

1 个答案:

答案 0 :(得分:2)

我认为你想使用标题名称作为上下文键:

for name, header := range Headers {
  val := r.Header.Get(header)
  if len(val) > 0 {
    ctx = context.WithValue(ctx, contextKey(name), val)
  }
}

或者,将标题存储为单个值:

ctx = context.WithValue(ctx, contextKey("headers"), Headers)