使用requests发起gRPC登录请求的POST payload格式问题求助
你遇到的报错本质是直接复制的Chrome请求体不符合gRPC的HTTP2传输规范,导致服务端错误解析出超大长度的消息。正确的请求构造流程如下:
核心前提
首先需要获取目标gRPC服务对应的.proto接口定义文件,你可以从服务提供方处获取,若服务端开启了gRPC反射功能,也可以通过反射工具拉取接口定义,这是构造合法请求的核心依据。
具体实现步骤
- 编译proto文件生成Python代码
先安装依赖:pip install grpcio grpcio-tools
执行编译命令:python -m grpc_tools.protoc -I./proto目录路径 --python_out=. --grpc_python_out=. ./proto目录路径/服务定义文件名.proto
编译完成后会生成*_pb2.py(消息类型定义)和*_pb2_grpc.py(服务接口定义)两个文件。 - 构造并序列化请求参数
导入生成的*_pb2模块,按照登录接口的字段要求填充邮箱、密码等参数,再调用SerializeToString()方法将请求对象序列化为Protobuf格式的二进制数据。 - 拼接gRPC请求体固定前缀
gRPC的HTTP2请求体必须包含5字节的固定前缀:第1位是压缩标记位(0表示未压缩),第2-5位是Protobuf序列化数据的大端序4字节长度值。示例代码如下:import struct # serialized_data为上一步得到的Protobuf序列化二进制数据 grpc_body = b'\x00' + struct.pack('>I', len(serialized_data)) + serialized_data - 配置必填请求头
除了开启HTTP2客户端支持外,必须携带以下请求头:
不需要手动设置content-type: application/grpc grpc-accept-encoding: identity, deflate, gzipcontent-length头,HTTP2客户端会自动计算生成。 - 发起请求
注意原生requests不支持HTTP2,你可以使用requests+hyper适配器,或者直接使用支持HTTP2的httpx库,将构造好的grpc_body作为请求的data参数传入即可。
报错原因说明
Chrome网络面板中显示的请求体是转义后的二进制明文,你直接复制的字符串转成二进制后,格式和长度完全不符合gRPC要求,服务端读取前5字节解析消息长度时,会把错误内容解析成超大数值,就会触发你收到的长度超限报错。
内容的提问来源于stack exchange,提问作者vimbing
相关产品推荐
相关产品推荐

