2

我正在使用项目提供外部 WSDL 文件的 SOAP 服务。我正在使用 Python + Suds 连接到该服务。我遇到了问题,因为 (https) 服务 URL 如下所示:

/sipxconfig/services/UserService?wsdl

但是该 URL的 WSDL 与项目提供的外部 WSDL 文件不匹配。返回的 SOAP 文档外部 WSDL 文件匹配。所以我的 suds 客户提出了一个错误。

到目前为止,我已经设法通过编写一个 suds 插件来“纠正”返回的 SOAP XML 以使其与动态创建的 WSDL(在 URL 处)相匹配来解决这个问题。但是,我希望有一种方法可以为 subs 客户端提供外部 WSDL 文件,然后将其切换为使用服务的 URL。

我试过这样的事情:

wsdl_file = os.path.abspath(args.wsdl_file)
client = Client("file://%s" % wsdl_file, transport=t, username=sip_user, password=sip_pwd, doctor=doctor)
client.set_options(location=url)

#Get the results.
user_search = client.factory.create("UserSearch")
user_search.byUserName = args.find_user
user_search.byFuzzyUserNameOrAlias = args.fuzzy
user_search.byGroup = args.group

result = client.service.findUser(user_search)
#^^^
#Error here!

但它最终导致MethodNotFound异常。我在另一个终端上运行 netstat,我可以看到客户端没有与外部服务建立网络连接。

有其他人设法从文件中提供 Suds WSDL 吗?

谢谢,卡尔

4

1 回答 1

2

所以我确定我在正确的轨道上,但我的 SOAP 服务有多个端口。我需要执行以下操作:

wsdl_file = os.path.abspath(args.wsdl_file)
client = Client("file://%s" % wsdl_file, transport=t, username=sip_user, password=sip_pwd, doctor=doctor)
client.set_options(location=url)

#Get the results.
user_search = client.factory.create("UserSearch")
user_search.byUserName = args.find_user
user_search.byFuzzyUserNameOrAlias = args.fuzzy
user_search.byGroup = args.group

result = client.service['UserService'].findUser(user_search)
#                      ^^^^^^^^^^^^^^^
# This was the missing bit that threw me off!

谢谢,卡尔

于 2013-04-26T18:40:23.110 回答