【问题标题】:Setting grpc metadata in http request在 http 请求中设置 grpc 元数据
【发布时间】:2019-02-05 03:10:16
【问题描述】:

我正在尝试使用 grpc-gateway 为现有 gRPC 服务创建 REST 端点。 gRPC 服务利用 grpc 调用中传递的“元数据”进行身份验证。 如何在我的 REST 调用中设置元数据?

我尝试在标头中传递元数据键值对。但它没有在上下文中设置元数据。

【问题讨论】:

  • 您使用什么库来创建和发送 REST 请求?

标签: rest grpc grpc-gateway


【解决方案1】:

这里的技巧是使用自定义传入的标头匹配器。您可以在源代码或 grpc-gatway 中看到,有一个 WithIncomingHeaderMatcher 将传入的 HTTP 标头转换为传递到上下文的元数据(稍后由 gRPC 服务器处理程序使用)。默认情况下,它支持一组所谓的permanent HTTP headers,它们按原样传递(例如,Authorization 标头将在上下文中显示为Authorization),或者您需要在自定义标头前加上特定的前缀前缀Grpc-Metadata-,请参阅its usage here。在这种情况下,Grpc-Metadata-Your-Name HTTP 标头将作为元数据中的Your-Name 字段出现。

再次,如果这对您和您来说太成问题而无法通过,例如。 X-User-Id 或任何自定义格式的标题到您的应用程序中,您需要设置自定义标题匹配器。我建议明确处理您的标头,然后回退到默认标头(如果您随后更新依赖项并添加一些新的 permanentHTTPHeader,效果会很好:

    func headerMatcher(header string) (string, bool) {
        if header == "X-User-Id" {
            return "x-user-id", true
        }
        return runtime.DefaultHeaderMatcher(header)
    }

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多