当前位置: 首页 > 知识库问答 >
问题:

如何在java中从grpc请求中获取请求标头?

颜镜
2023-03-14

我正在构建一个Java的grpc服务器,我很难得到请求头。proto文件是使用Pro buf-maven-plugin编译的,基于生成的存根,我无法访问上下文或请求元数据。

我还尝试在消息请求中定义一个键/值列表,希望grpc能够处理头映射,但目前为止没有成功。

知道我怎么能拿到标题吗?

谢谢

我的原型文件内容:

...
// Version Request
message VersionRequest {
  // key/value pairs
  repeated Header headers = 1;
}

message Header {
  //key
  string key = 1;
  //value
  string constant = 2;
}
...



   ...
security_definitions: {
    security: {
      key: "clientIdAuth";
      value: {
        type: TYPE_API_KEY;
        in: IN_HEADER;
        name: "x-client-id";
      }
    }
    security: {
      key: "clientSecretAuth";
      value: {
        type: TYPE_API_KEY;
        in: IN_HEADER;
        name: "x-client-secret";
      }
    }
    security: {
      key: "bearerAuth";
      value: {
        type: TYPE_API_KEY;
        in: IN_HEADER;
        name: "Authorization";
      }
    }
  }
    ...
    // Retrieves system version
      //
      // Retrieves system version
      rpc GetVersion(VersionRequest) returns (Version) {
        option (google.api.http) = {
          get : "/api/v4/version"
        };
        option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {
          security: {
            security_requirement: {
              key: "clientIdAuth";
              value: {}
            }
            security_requirement: {
              key: "clientSecretAuth";
              value: {}
            }
            security_requirement: {
              key: "bearerAuth";
              value: {}
            }
          }
        };
      }
    ...

服务器端实现如下所示:

...
@GrpcService
public class GrpcAPIService extends MixAPIGrpc.MixAPIImplBase {

    @Autowired
    private MwProxy mwProxy;

    @Override
    public void getVersion(VersionRequest versionRequest, StreamObserver<Version> streamObserver) {
        System.out.println("===============" + versionRequest.getHeadersCount());
        handleEGrpcCall("getVersion", mwProxy::getVersion, streamObserver);
    }
...

版本请求。getHeadersCount()始终返回0,尽管在所有我的请求中都发送了3个标头。

共有2个答案

巫马泓
2023-03-14

标头,我想是您正在谈论的HTTP标头,属于HTTP协议。这就是为什么您未能在gRPC层中获取它。如果您使用MVC框架,请确保在Servlet或Controller中检索它(添加HttpServletRequest参数如下)。

  @GetMapping("hello")
  public CompletableFuture<GreetingResponse> greet(HttpServletRequest request, @RequestParams someParam) {
  // call gRPC Service here
}

然后您可以通过request.getHeader("User-Agent")访问标头。

柯唯
2023-03-14

除非您使用的是第三方提供的自定义grpc java codegen插件,否则grpc java库附带的标准grpc codegen插件https://search.maven.org/search?q=a:protoc-gen grpc java g:io。grpc不支持自定义方法选项,例如

option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation)

所以你不能利用这些选项。grpc-java可以做的是通过客户端和服务器拦截器发送和接收io.grpc.元数据。参见示例:https://github.com/grpc/grpc-java/tree/v1.33.1/examples/src/main/java/io/grpc/examples/header

 类似资料:
  • 问题内容: 我需要获取所有Django请求标头。根据我的阅读,Django只是将所有内容与大量其他数据一起转储到变量中。获取客户端发送到我的Django应用程序的所有标头的最佳方法是什么? 我将使用它们来构建httplib请求。 问题答案: 根据文档,这 是“包含所有可用HTTP标头的标准Python词典”。如果要获取所有标头,则可以简单地遍历字典。 代码的哪一部分执行此操作取决于你的确切要求。有

  • 我尝试做的是从同一个站点发布数据并从它创建一个新的订单(当提交按钮被点击时)。我没有任何信息在我的请求。身体,我怀疑是在我的ejs出了问题,任何反馈是非常感谢的。 我的ejs文件: 和我的js文件:

  • 问题内容: 我正在使用python中的请求库发出HTTP请求,但我需要来自响应http请求的服务器的IP地址,因此,我试图避免进行两次调用(可能与响应的IP地址不同)请求。 那可能吗?是否有任何python http库允许我这样做? ps:我还需要发出HTTPS请求并使用经过身份验证的代理。 更新1: 例: 然后,我想知道响应中的方法或属性将哪些IP地址请求连接到了。在其他库中,我可以通过找到袜子

  • 我如何解析JSON请求之类的东西? 示例代码: 带有_名称的位置_为无

  • 我用的是Spring靴。我已经为SOAP web服务编写了一个ClientInterceptor,我想记录我要向其发送请求的URL,并且我想在HandlerResponse方法中这样做。然而,我找不到一个方法来做到这一点。有可能吗?任何帮助都会很好。 创建restTemplate的方式