You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用zeep调用BSE SOAP API时服务端返回404错误如何解决

问题根因
  • 服务实例不匹配:初始化zeep客户端时使用了订单服务的WSDL配置,但待调用的getPassword方法属于上传服务,zeep默认按WSDL内置的订单服务地址发起请求,该地址无对应接口,直接返回404。
  • 请求端点未覆盖:自定义SOAP头中的To参数仅为SOAP协议层面的寻址参数,不会修改实际HTTP请求的目标地址。
  • 头结构冗余:自定义Header额外嵌套了一层<Header>标签,导致请求中出现两套WS-Addressing参数,可能触发服务端校验拦截。
修复代码
import zeep

def soap_set_wsa_headers(method_url, svc_url):
    # 直接构造WS-Addressing标准元素,无需额外嵌套Header层
    action_ele = zeep.xsd.Element(
        "{http://www.w3.org/2005/08/addressing}Action", zeep.xsd.String()
    )
    to_ele = zeep.xsd.Element(
        "{http://www.w3.org/2005/08/addressing}To", zeep.xsd.String()
    )
    return [action_ele(method_url), to_ele(svc_url)]

# 上传服务Demo环境配置
WSDL_UPLOAD = "https://bsestarmfdemo.bseindia.com/MFUploadService/MFUploadService.svc?singleWsdl"
SVC_UPLOAD = "https://bsestarmfdemo.bseindia.com/MFUploadService/MFUploadService.svc/Basic"
METHOD_PREFIX = "https://bsestarmfdemo.bseindia.com/2016/01/IMFUploadService/"

# 1. 用上传服务WSDL初始化客户端
client = zeep.Client(wsdl=WSDL_UPLOAD)
# 2. 显式指定请求端点,覆盖WSDL内置地址
# 可通过print(client.wsdl.bindings)查看正确的binding标识
upload_service = client.create_service(
    "{http://tempuri.org/}BasicHttpBinding_IMFUploadService",
    SVC_UPLOAD
)
# 3. 构造请求头
req_headers = soap_set_wsa_headers(METHOD_PREFIX + "getPassword", SVC_UPLOAD)
# 4. 发起请求
resp = upload_service.getPassword(
    UserId="3081801",
    Password="Abc4231",
    PassKey="anything",
    _soapheaders=req_headers
)
print(resp)
补充说明

如果调用时提示binding不存在,可执行print(client.wsdl.bindings)输出所有可用的binding名称,替换create_service的第一个参数即可。

内容的提问来源于stack exchange,提问作者Karmvir Khangura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:27:03