You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在gRPC-Gateway中从请求元数据获取自定义请求头

问题:gRPC服务器无法获取自定义请求头Custom-header

我设置的允许自定义请求头的CORS策略如下:

return http.ListenAndServe(":"+port,
    handlers.CORS(handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization","Custom-header"}),
        handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE"}),
        handlers.AllowedOrigins([]string{"*"}))(mux))

在gRPC服务器中,我尝试通过以下代码读取请求头:

md, ok := metadata.FromIncomingContext(ctx)
if !ok {
    fmt.Println(fmt.Sprintf("%v", ok))
}

fmt.Println(fmt.Sprintf("%v", md))

但元数据中能获取到Authorization请求头,却无法获取到Custom-header,请问该如何获取这个自定义请求头及其值?


解决方案

1. 适配gRPC元数据的小写转换规则

gRPC在将HTTP请求头转换为元数据时,会自动将所有头名转为全小写格式。你之前用Custom-header去匹配是找不到的,需要改用小写的custom-header来读取:

md, ok := metadata.FromIncomingContext(ctx)
if !ok {
    fmt.Println("无法获取请求元数据")
    return
}
// 读取小写的自定义头
customHeaderVals := md.Get("custom-header")
if len(customHeaderVals) > 0 {
    fmt.Println("Custom-header的值为:", customHeaderVals[0])
} else {
    fmt.Println("未获取到Custom-header")
}

2. 确保gRPC-Gateway转发自定义头

如果你是通过gRPC-Gateway实现HTTP到gRPC的请求转换,默认情况下网关不会转发所有自定义头,需要显式配置头匹配器,让它将Custom-header转发到gRPC元数据中:

// 创建gRPC-Gateway多路复用器时配置头匹配
gwmux := runtime.NewServeMux(
    runtime.WithIncomingHeaderMatcher(func(key string) (string, bool) {
        if key == "Custom-header" {
            // 将HTTP头映射为小写的gRPC元数据键
            return "custom-header", true
        }
        // 保留默认的头匹配逻辑,处理其他标准头
        return runtime.DefaultHeaderMatcher(key)
    }),
)

3. 验证CORS预检请求的正确性

确认浏览器发送的OPTIONS预检请求中,服务器返回的Access-Control-Allow-Headers响应头包含Custom-header。可以通过浏览器开发者工具的网络面板查看:

  • 找到对应的OPTIONS请求
  • 检查响应头中的Access-Control-Allow-Headers字段,确认Custom-header在列表内

如果预检请求未返回这个头,浏览器会阻止发送带自定义头的实际请求,自然无法在gRPC服务器中获取到。


内容的提问来源于stack exchange,提问作者Shehzab Ahammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:10:14