如何在gRPC Java服务端设置并发送响应Header
gRPC Java服务端响应Header/Trailer设置方法
在业务实现方法内直接操作的实现逻辑如下:
实现步骤
- 将方法入参的
StreamObserver强转为ServerCallStreamObserver,这是gRPC Java服务端侧响应观察者的实际实现类,封装了头、Trailer的操作能力。 - 构造
Metadata对象存储头/Trailer的键值对。 - 发送响应头必须在第一次调用
onNext()之前执行。 - 绑定Trailer后会在RPC调用结束时自动发送。
完整代码示例
import io.grpc.Metadata; import io.grpc.stub.ServerCallStreamObserver; @Override public void getResult(Request request, StreamObserver<Response> responseObserver) { // 强转为服务端专属的StreamObserver实现 ServerCallStreamObserver<Response> serverObserver = (ServerCallStreamObserver<Response>) responseObserver; // 构造响应Header元数据 Metadata responseHeader = new Metadata(); Metadata.Key<String> headerKey = Metadata.Key.of("header-key", Metadata.ASCII_STRING_MARSHALLER); responseHeader.put(headerKey, "val"); // 发送响应Header,必须在onNext之前调用 serverObserver.sendHeaders(responseHeader); // 返回业务响应体 responseObserver.onNext(new Response("check")); // 构造Trailer元数据 Metadata responseTrailer = new Metadata(); Metadata.Key<String> trailerKey = Metadata.Key.of("trailer-key", Metadata.ASCII_STRING_MARSHALLER); responseTrailer.put(trailerKey, "val"); // 绑定Trailer,会随onCompleted一起发送 serverObserver.setTrailers(responseTrailer); responseObserver.onCompleted(); }
注意事项
sendHeaders()必须早于第一次onNext()调用,否则会触发运行时异常,gRPC协议要求响应头必须先于响应体发送- 若自定义Header的value包含非ASCII字符,需要将Marshaller替换为
Metadata.STRING_MARSHALLER - 若存在全局统一添加Header/Trailer的需求,更推荐使用
ServerInterceptor拦截器实现,无需修改每个业务方法的代码
内容的提问来源于stack exchange,提问作者Vishal Neekhra
相关产品推荐
相关产品推荐

