C++ gRPC服务端如何检测客户端请求的压缩算法?
问题概述
grpc::ServerContext和grpc::ClientContext均提供compression_algorithm()获取方法与set_compression_algorithm()设置方法- 客户端调用
set_compression_algorithm()用于压缩请求数据,服务端调用该方法用于压缩响应数据 - 客户端设置的压缩算法会被存入内部元数据
grpc-internal-encoding-request,但服务端无法通过grpc::ServerContext::client_metadata访问该内部元数据 - 核心需求:服务端获取客户端请求使用的压缩算法,并为响应设置相同的算法
解决方案
由于gRPC C++的ServerContext未直接暴露获取请求压缩算法的接口,需要借助底层C API实现:
- 从
grpc::ServerContext中获取底层的grpc_call指针 - 使用
grpc_call_get_compression_algorithm获取请求的压缩算法 - 将获取到的算法设置为响应的压缩算法
代码示例
#include <grpcpp/server_context.h> #include <grpc/grpc.h> void YourServiceRpcMethod(grpc::ServerContext* context, const YourRequest* request, YourResponse* response) { // 获取底层gRPC调用对象 grpc_call* raw_call = context->call(); grpc_compression_algorithm request_algo; grpc_error* err = grpc_call_get_compression_algorithm(raw_call, &request_algo); if (err == GRPC_ERROR_NONE) { // 为响应设置与请求相同的压缩算法 context->set_compression_algorithm(request_algo); } else { // 处理获取失败的情况,比如使用默认压缩策略 grpc_error_destroy(err); } // 执行你的业务逻辑... }
注意事项
- 需要包含gRPC C API的头文件
<grpc/grpc.h>才能使用grpc_call_get_compression_algorithm - 如果请求未使用压缩,
grpc_call_get_compression_algorithm会返回错误,此时可选择使用服务端默认的压缩算法
内容的提问来源于stack exchange,提问作者Arkady Rudenko
相关产品推荐
相关产品推荐

