Python基于zeep调用SOAP API ping接口连接超时问题咨询
问题1:10.90.XXX.YY的来源
这个IP是从你配置的WSDL文件内容里解析出来的,不是写在你本地项目代码里的。
你在config.py里配置的WSDL_SALES是WSDL描述文件的拉取地址,Zeep初始化时会从这个地址下载WSDL文件,文件里的<soap:address location=""/>标签写的就是SOAP服务实际调用的端点地址,这个10.90的内网IP就是存在这个远程WSDL的标签里的,所以你本地搜不到。日志里的Forcing soap:address location to HTTPS警告也能佐证:Zeep检测到WSDL里的地址配置有问题,已经在强制修改协议为HTTPS,但不会修改内置的IP地址。
问题2:初始化成功但连接失败的原因和修复方案
原因
Zeep初始化WSDL只做了「下载WSDL文件、解析SOAP接口结构」这两步,没有实际发起业务请求,所以只要能正常拉取到WSDL文件就会提示初始化成功。你调用ping方法的时候才会真的向WSDL内置的10.90内网IP发请求,这个IP是外部公司的内网地址,你本地公网环境根本连通不了,所以才会报连接超时错误。
修复方案
- 手动覆盖SOAP服务端点地址
不用WSDL内置的地址,手动指定实际可用的公网调用地址,修改externalcompany_myservice_api.py的init_wsdl方法即可,示例如下:
@staticmethod def init_wsdl(type_wsdl): logging.info("S - initialise wsdl") settings = Settings(strict=False, xml_huge_tree=True) wsdl_externalcompany = Client(wsdl=type_wsdl, settings=settings) # 新增这行,手动覆盖WSDL内置的调用地址,和WSDL拉取地址去掉?WSDL后缀一致即可 wsdl_externalcompany.service._binding_options['address'] = "https://externalcompanyapi.vendorcompany.com/WebServices/Api/SalesApi.asmx" logging.info("Created wsdl externalcompany connection") logging.info("E - initialise wsdl") return wsdl_externalcompany
如果上面的写法不生效,可使用Zeep更规范的create_service方法绑定自定义地址,绑定名和命名空间可以直接从你下载的WSDL文件开头部分查到。
- 排查网络连通性
如果修改地址后还是超时,按优先级排查以下问题:
- 访问外部公司的SOAP API是否需要连接专用VPN,本地开发环境先连VPN再测试
- 你的公网IP是否在外部公司的接口白名单内,申请白名单权限
- 本地防火墙/公司出口网关是否拦截了对应端口的出站请求
- 适配Tornado异步逻辑
你当前用的Zeep Client是同步客户端,直接在Tornado协程里调用会阻塞IO循环,建议换成Zeep的AsyncClient,或者把同步调用丢到线程池中执行,避免影响服务性能。
内容的提问来源于stack exchange,提问作者Tms91
相关产品推荐
相关产品推荐

