如何从用户请求中提取路径在golang grpc-gateway中。

huangapple go评论96阅读模式
英文:

How to extract path from user request in golang grpc-gateway

问题

我有一个问题。是否可以从用户请求中提取元数据路径?

这是我的proto文件,其中定义了一个方法。

rpc AllPath(google.protobuf.Empty) returns (google.protobuf.Empty) {
  option (google.api.http) = {
    get: "/*",
  };
}
rpc Auth(google.protobuf.Empty) returns (TokenRender) {
  option (google.api.http) = {
    get: "/auth"
  };
}

在我的服务器文件中的AllPath函数中,我使用了grpc-gateway生态系统网站上找到的类似以下的代码。

path := make(map[string]string)
if pattern, ok := runtime.HTTPPathPattern(ctx); ok {
    path["pattern"] = pattern // /v1/example/login
}
fmt.Printf("当前路径为:%v", path["pattern"])

但是我的当前模式/路径就像我在proto文件中定义的那样:当前路径为:/*

如果有人知道如何处理这个问题,我将不胜感激 如何从用户请求中提取路径在golang grpc-gateway中。

最好,Kacper

英文:

i have a question. Is it possible to extract via metadata path from user request.

Here i have my proto file with defined method.

  rpc AllPath(google.protobuf.Empty) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      get: "/*",
    };
  }
  rpc Auth(google.protobuf.Empty) returns (TokenRender) {
    option (google.api.http) = {
      get: "/auth"
    };
  }
}

In AllPath function in my server file im using something like this, found on grpc-gateway ecosystem website.

	path := make(map[string]string)
	if pattern, ok := runtime.HTTPPathPattern(ctx); ok {
		path["pattern"] = pattern // /v1/example/login
	}
	fmt.Printf("Current path is: %v", path["pattern"])

but my current pattern/path is like i defined in proto file: Current path is: /*

If anyone have idea how to deal with this thing i would appreciate it 如何从用户请求中提取路径在golang grpc-gateway中。

Best, Kacper

答案1

得分: 2

gRPC-Gateway通过gRPC元数据从原始的HTTP请求中传递各种信息。然而,我不认为原始路径是被提供的。但是,仍然可以通过注册一个元数据注解器来获取传递的路径。

在调用github.com/grpc-ecosystem/grpc-gateway/v2/runtime.NewServeMux()时,可以利用WithMetadata选项函数:

mux := runtime.NewServeMux(runtime.WithMetadata(func(_ context.Context, req *http.Request) metadata.MD {
	return metadata.New(map[string]string{
		"grpcgateway-http-path": req.URL.Path,
	})
}))

然后在你的gRPC服务实现中,可以通过传入的上下文检索该值:

func (s *server) AllPath(ctx context.Context, _ *emptypb.Empty) (*emptypb.Empty, error) {
	md, _ := metadata.FromIncomingContext(ctx)
	log.Printf("path: %s", md["grpcgateway-http-path"][0])
	return &emptypb.Empty{}, nil
}

当访问/foo时,这将记录:

2022/10/25 15:31:42 path: /foo
英文:

gRPC-Gateway passes various bits of information from the originating HTTP request via gRPC metadata. I don't believe the raw path is supplied, however. It is still possible to get the path passed through by registering a metadata annotator.

When calling github.com/grpc-ecosystem/grpc-gateway/v2/runtime.NewServeMux(), leverage the WithMetadata option func:

mux := runtime.NewServeMux(runtime.WithMetadata(func(_ context.Context, req *http.Request) metadata.MD {
	return metadata.New(map[string]string{
		"grpcgateway-http-path": req.URL.Path,
	})
}))

Then in your gRPC service implementation, you can retrieve the value via the incoming context:

func (s *server) AllPath(ctx context.Context, _ *emptypb.Empty) (*emptypb.Empty, error) {
	md, _ := metadata.FromIncomingContext(ctx)
	log.Printf("path: %s", md["grpcgateway-http-path"][0])
	return &emptypb.Empty{}, nil
}

When hitting, e.g. /foo, this should log:

2022/10/25 15:31:42 path: /foo

huangapple
  • 本文由 发表于 2022年10月25日 21:38:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/74194970.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定