使用Wire框架调用gRPC风格URL时的路径与冒号配置问题
解决Wire框架调用Google Photos gRPC API的路径问题
我来帮你搞定这两个Wire框架使用里的路径配置坑——这俩都是适配Google这类gRPC Transcoding(REST风格gRPC)场景时的常见问题:
1. 正确保留API版本前缀/v1
你当前在baseUrl里加/v1的写法,Wire会默认把它当作服务根路径的一部分,反而会忽略掉。更合理的做法是把baseUrl只设为根域名,然后通过proto文件的HTTP注解来指定包含版本前缀的完整路径:
GrpcClient.Builder() .client(okHttpClient) .baseUrl("https://photoslibrary.googleapis.com") // 仅保留根域名 .build()
2. 配置支持带冒号的URL格式
Google Photos的mediaItems:search是gRPC Transcoding的标准路径格式,需要在proto文件中添加google.api.http注解来绑定方法与HTTP路径。具体步骤如下:
首先,在proto文件中导入Google的API注解依赖:
import "google/api/annotations.proto";
然后修改服务方法,添加HTTP映射配置:
service MediaItems { rpc Search(SearchMediaItemCommand) returns (stream SearchMediaItemUpdate) { option (google.api.http) = { post: "/v1/mediaItems:search" body: "*" // 表示将请求体完整作为HTTP请求的body }; } }
这样Wire生成代码时,就会根据这个注解构造出符合要求的/v1/mediaItems:search路径,而不是默认的/MediaItems/Search格式。
额外提示
如果你的项目还没引入Google API的proto依赖,需要在构建工具中添加对应依赖(以Gradle为例):
implementation "com.google.api.grpc:proto-google-common-protos:2.20.0"
这种方式比用OkHttp拦截器修改路径优雅得多,完全符合Wire框架的设计逻辑。
内容的提问来源于stack exchange,提问作者Jacek Kwiecień
相关产品推荐
相关产品推荐

