在使用 gRPC-gateway 时,可以为所有代理的请求附加一个 header 参数。具体步骤如下:
在 gRPC service 中定义一个 context.Context 参数,用于接收元数据。
在转发器中创建一个新的上下文,并将需要添加的 header 参数作为元数据传递给服务端。
例如,在以下的 proto 文件中定义了一个名为 Authorization
的 HTTP 请求头:
syntax = "proto3";
package example;
import "google/api/annotations.proto";
import "google/protobuf/empty.proto";
service MyService {
rpc MyMethod (google.protobuf.Empty) returns (google.protobuf.Empty) {
option (google.api.http) = {
post: "/my/method"
body: "*"
};
}
}
然后,在实现服务端的方法时,可以添加一个 context.Context
参数来接收该请求头:
func (s *myServiceServer) MyMethod(ctx context.Context, req *empty.Empty) (*empty.Empty, error) {
authorization := metadata.Get(ctx, "authorization")
// 处理业务逻辑...
}
最后,在转发器中创建一个新的上下文,并将需要添加的 header 参数作为元数据传递给服务端:
mux := runtime.NewServeMux()
metadata := metadata.Pairs("authorization", "Bearer "+token)
ctx := metadata.NewOutgoingContext(context.Background(), metadata)
resp, err := client.MyMethod(ctx, req)
这样,每个通过 gRPC-gateway 转发到服务端的请求都会带有该 header 参数。