英文:
Errors when passing metadata into context in golang
问题
我正在处理处理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
}
}
我试图读取元数据字段(Headers)并将其传递给上下文。
我遇到了以下错误:cannot use header (type []string) as type string in map index
和cannot convert header (type []string) to type contextKey
。我通过访问索引并执行类似于val, ok := (*md)[header[0]]
的操作来修复上述错误。然而,我想将映射的所有元素传递给上下文。
有关如何解决这个问题的建议吗?
英文:
I am working on specific with handling GRPC requests. I am trying to pass the meta from my GRPC request into the context based on this code sample: https://github.com/go-kit/kit/blob/master/auth/jwt/transport.go#L47.
(just in case, the contextKey explanation can be referred here: https://medium.com/@matryer/context-keys-in-go-5312346a868d#.vn10llkse):
Below is my code:
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
}
}
I am trying to read metadata fields (Headers) and pass it to the context.
I am getting the following errors. cannot use header (type []string) as type string in map index
and cannot convert header (type []string) to type contextKey
. I had fixed the above errors by accessing the index and doing something like this val, ok := (*md)[header[0]]
. However, I want to pass all the elements of the map to the context.
Any suggestions on how to work around this problem?
答案1
得分: 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)
英文:
I think you want to use the header name as the context key:
for name, header := range Headers {
val := r.Header.Get(header)
if len(val) > 0 {
ctx = context.WithValue(ctx, contextKey(name), val)
}
}
Alternatively, store the headers as a single value:
ctx = context.WithValue(ctx, contextKey("headers"), Headers)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论