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

Posted

技术标签:

【中文标题】在 golang 中将元数据传递到上下文时出错【英文标题】:Errors when passing metadata into context in golang 【发布时间】:2017-02-16 18:02:25 【问题描述】:

我正在处理具体的处理 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]] 的操作来修复上述错误。但是,我想将地图的所有元素传递给上下文。

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

【问题讨论】:

如果一个标头有多个值,你想如何传递这些值?如果要单独添加它们,只需使用 for 循环。 【参考方案1】:

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

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)

【讨论】:

CeriseLimon:您对基于此github.com/go-kit/kit/blob/master/auth/jwt/transport.go#L47 读取 GRPC 请求的元数据有什么建议吗?

以上是关于在 golang 中将元数据传递到上下文时出错的主要内容,如果未能解决你的问题,请参考以下文章

在单独的控制器中将对象添加到上下文时出错

在 python 中将数据发送到 Web 浏览器时出错

在 React TS 中将道具传递给孩子时出错

在c#中将数据导出到Excel时出错(获胜表单)

在 Pig 中将关系传递给 Python UDF 时出错

在 MVC 中将数据从视图传递到控制器时,数据列表变为空