Python调用外部gRPC API报错‘gRPC requires HTTP/2’如何解决?
解决gRPC API调用的HTTP/2报错问题
目标API基于gRPC协议实现,而requests库默认使用HTTP/1.1发起请求,这就是报错gRPC requires HTTP/2的核心原因。以下是两种可行的解决办法:
方法一:使用gRPC原生客户端调用(推荐)
这是适配gRPC协议的标准方式,性能和兼容性最优,步骤如下:
- 安装依赖库
pip install grpcio grpcio-tools
- 获取目标API的
.proto定义文件(由API提供方给出),生成Python客户端代码
# 替换为实际的proto文件路径与名称 python -m grpc_tools.protoc -I./proto --python_out=. --grpc_python_out=. ./proto/company_content_search.proto
- 用生成的客户端代码发起调用
import grpc # 导入生成的proto相关模块 import company_content_search_pb2 import company_content_search_pb2_grpc def search_company_content(): # 创建加密gRPC通道,仅保留域名与默认端口443 with grpc.secure_channel('search.api.company.com:443', grpc.ssl_channel_credentials()) as channel: stub = company_content_search_pb2_grpc.SearchStub(channel) # 按照proto定义构造请求参数 request = company_content_search_pb2.SearchRequest( query="你的搜索关键词", # 补充其他必填参数 ) response = stub.Search(request) print(response) if __name__ == '__main__': search_company_content()
方法二:用支持HTTP/2的HTTP客户端调用(适合临时调试)
若目标API开启了gRPC-REST/JSON转码功能,可使用支持HTTP/2的httpx库发起请求:
- 安装依赖库
pip install httpx[http2]
- 编写调用代码(需严格匹配开发者工具中捕获的Payload格式)
import httpx import asyncio async def call_search_api(): async with httpx.AsyncClient(http2=True) as client: url = "https://search.api.company.com/company.content.search.v1.Search/Search" # 替换为实际请求体结构 payload = { "query": "你的搜索关键词", # 其他请求参数 } response = await client.post(url, json=payload) print(response.text) if __name__ == '__main__': asyncio.run(call_search_api())
注意事项
- 方法一必须依赖API的proto定义文件,是生产环境的首选方案。
- 方法二仅适用于目标API支持JSON转码的场景,请求体格式需完全匹配。
- 确保Python版本≥3.7,依赖库为最新稳定版,避免HTTP/2支持缺失问题。
内容的提问来源于stack exchange,提问作者Matt Override
相关产品推荐
相关产品推荐

