如何在自定义C++ Protobuf代码生成器中访问方法选项?
获取Protobuf MethodDescriptor中的google.api.http扩展选项
思路正确性确认
你通过MethodDescriptor::options().GetExtension()获取google.api.http扩展的思路是完全正确的,因为google.api.http是挂载在方法级别的Protobuf扩展字段,正好对应MethodDescriptor的options集合。
具体实现步骤
1. 依赖准备
确保生成器代码中已引入对应头文件,并在编译时链接annotations.proto生成的C++文件:
#include "google/api/annotations.pb.h"
2. 正确获取扩展选项
google.api.http的扩展标识符在头文件中已预定义为google::api::http,直接传入GetExtension即可。同时建议先通过HasExtension判断扩展是否存在,避免空访问:
const google::protobuf::FileDescriptor* file; const google::protobuf::MethodDescriptor* descriptor = file->service(0)->method(0); // 检查是否存在google.api.http扩展 if (descriptor->options().HasExtension(google::api::http)) { // 获取完整的http扩展配置 const google::api::HttpRule& http_rule = descriptor->options().GetExtension(google::api::http); // 获取post路径和body配置 std::string post_path = http_rule.post(); std::string body_field = http_rule.body(); // 后续处理逻辑,比如输出到生成的代码中 // ... }
3. 关键说明
google::api::HttpRule是google/api/annotations.proto定义的消息类型,包含了post、get、body等所有HTTP转码相关字段- 如果你的proto中使用了其他HTTP方法(如get、put),可以通过
http_rule.get()、http_rule.put()等对应方法获取 - 当
body设为"*"时,会返回字符串"*",对应将整个请求体映射到Protobuf请求消息
内容的提问来源于stack exchange,提问作者phoenix76
相关产品推荐
相关产品推荐

