使用GRPC服务器拦截器验证请求

4

我需要使用拦截器验证和记录一些grpc服务请求的数据。我查看了ServerInterceptor的interceptCall方法,但找不到获取请求对象的方法。是否有办法在拦截器内部获取请求对象?

1个回答

2

您需要返回并扩展ForwardingServerCallListener,并监听ServerCall.Listener.onMessage()回调。


好的,谢谢。所以,当验证通过时,我在我的onMessage()实现中调用super.onMessage(message)。而在出现错误时,我可以使用call#close(Status) - Dmitry Minkovsky
是的,您可以使用call.close(),但由于call不是线程安全的,因此只有在未将call传递到拦截器链时才能使用它。因此,对于一元调用,您可以延迟传播标头直到第一条消息。对于流式传输,情况会变得更加复杂。 - Eric Anderson
谢谢Eric。如果我调用next.startCall(call, headers);来获取我的ForwardingServerCallListener委托,那么我是否已经将调用传递到拦截器链中了?从文档上看,我认为不是这样的... 我假设“将调用传递到拦截器链中”意味着使用super.onMessage()。我正在使用直接执行器,所以这应该没有关系吧? - Dmitry Minkovsky
是的,调用 startCall 就是将呼叫传递到链中。基本上,应用程序将接收到呼叫,然后可以开始调用它的方法。onMessage 用于监听器,其方向相反。“上行”与“下行”的区分有些模糊;重要的是看链中的下一个拦截器(或应用程序)是否已经接收到呼叫。 - Eric Anderson
你能提供一个 Github 链接吗?如果有完整的示例,更容易理解。谢谢。 - Cheng
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接