soaplib在字符串负载中处理XML字符的问题

0 投票
2 回答
680 浏览
提问于 2025-04-16 01:55

我用soaplib创建了一个简单的SOAP网络服务,但遇到了一个问题,就是发送的SOAP参数中如果包含了&符号或者尖括号,即使进行了转义,这些参数也会被忽略。

无论这个方法是设置为接受普通字符串还是类型为'任何'的普通参数,只要引入了这些字符,就会出现一个网络错误(使用suds时),错误信息是:

suds.WebFault: Server raised fault: 'my_method() takes exactly 2 arguments (1 given)'

现在,我把方法的其他代码去掉了,只保留了关键部分:

@soapmethod(soap_types.String, _returns=soap_types.Boolean)
def my_method_(self, sample):
    return True

调用这个方法时,如果传入一个简单的字符串是没问题的,比如在suds中,

suds_object.service.my_method('Hello World')

结果是“true”。但是如果加上任何&符号或尖括号,比如:

suds_object.service.my_method('Hello & World')

就会抛出异常。打开日志后我发现suds确实在转义这些字符。目前我已经搞清楚问题不在基础层面,但我还是不知道问题出在哪里。这让通过服务发送XML数据变得相当困难。

使用的类是SimpleWSGISoapApp的一个子类,而这个方法作为Django视图提供服务。我注意到,当尝试使用Hello World示例,使用soaplib客户端库时,一切都运行得很好。

2 个回答

1

我在使用Python中的一些“简单”的SOAP库时遇到了问题,特别是suds。之前我有个问题,后来让我转而使用soapPy,结果和你类似的问题就解决了。

Suds + JIRA = SAXException

那个问题里也提到了一些不错的建议,比如使用wireshark(或者在谷歌上搜索“soap调试器”)来查看底层发生了什么。

0

问题根本不在于soaplib,而是在Django的代码上。那段代码出于某种原因在读取request.POST.items(),这导致SOAP请求在遇到特殊字符(比如=、&、>)时被切割了。后来我换用了soaplib的最新版本,更新了Django的代码,这样就解决了参数错误和lxml引发的相关Unicode值错误。

撰写回答