Python如何调用带身份验证与指定endpoint的WSDL接口服务
Python调用指定Endpoint的WSDL接口解决方案
问题根因
当前你已经完成WSDL文件的鉴权拉取,接口调用失败的核心原因是没有显式绑定业务endpoint地址,同时调用方法时需要匹配WSDL定义的入参格式。
推荐Zeep实现方案(suds已停止维护)
完整可运行代码如下:
import requests from requests.auth import HTTPBasicAuth from requests import Session from zeep import Client from zeep.transports import Transport # 配置参数 WSDL_URL = "https://sigaf.hacienda.go.cr/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding?sap-client=500" USERNAME = 'Ws_cgr' PASSWORD = 'Claves+2021' TARGET_ENDPOINT = 'https://sigaf.hacienda.go.cr/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding' # 初始化带鉴权的请求会话 session = Session() session.auth = HTTPBasicAuth(USERNAME, PASSWORD) # 如遇SSL证书报错可临时加下行关闭验证,生产环境建议导入官方根证书 # session.verify = False # 初始化WSDL客户端 client = Client(WSDL_URL, transport=Transport(session=session)) # 核心步骤:绑定自定义业务endpoint # 注:如提示binding不存在,可执行print(client.wsdl.bindings)输出所有可用binding键名,替换下行第一个参数 service = client.create_service( '{urn:sap-com:document:sap:soap:functions:mc-style}binding', TARGET_ENDPOINT ) # ---------------------- 方法调用示例 ---------------------- # 1. 先打印方法入参结构,确认字段要求 print("ZwsYMhd76000042方法入参结构:", client.get_type('ZwsYMhd76000042')) # 2. 传入对应参数调用方法 response = service.ZwsYMhd76000042( # 按入参结构填入对应参数,示例:I_BUKRS='1000', I_DATE='20240101' ) print("接口返回结果:", response) # 其余两个方法调用逻辑一致 # print("ZwsZfmMensual方法入参结构:", client.get_type('ZwsZfmMensual')) # response1 = service.ZwsZfmMensual(对应参数) # print("ZwsZinforme37Newm方法入参结构:", client.get_type('ZwsZinforme37Newm')) # response2 = service.ZwsZinforme37Newm(对应参数)
Suds兼容实现方案
如果需要继续使用suds库,使用如下代码配置endpoint:
from suds.client import Client WSDL_URL = "https://sigaf.hacienda.go.cr/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding?sap-client=500" USERNAME = 'Ws_cgr' PASSWORD = 'Claves+2021' TARGET_ENDPOINT = 'https://sigaf.hacienda.go.cr/sap/bc/srt/rfc/sap/zfmg_reports/500/zfmg_reports/binding' # 初始化客户端 client = Client(WSDL_URL, username=USERNAME, password=PASSWORD) # 核心步骤:设置业务endpoint client.set_options(location=TARGET_ENDPOINT) # 调用方法示例 response = client.service.ZwsYMhd76000042(对应参数) print(response)
调试建议
- 调用方法前先打印入参结构,严格匹配字段名和数据类型,SAP接口通常要求参数为字符串格式的数字、日期
- 如返回权限类错误,确认账号是否开通了三个方法的调用权限
- 网络问题可先通过Postman等工具调用接口验证连通性,再同步到Python代码中
内容的提问来源于stack exchange,提问作者Oscar CENTENO MORA
相关产品推荐
相关产品推荐

