SOAP, Python, suds
请推荐一个可以在Python中处理SOAP的库。
现在,我正在尝试使用“suds”,但我不明白如何从服务器的回复中获取HTTP头信息。
代码示例:
from suds.client import Client
url = "http://10.1.0.36/money_trans/api3.wsdl"
client = Client(url)
login_res = client.service.Login("login", "password")
变量“login_res”包含XML格式的回答,但里面没有HTTP头信息。不过我需要从中获取会话ID。
3 个回答
0
我觉得Suds库的文档写得不好,所以我建议你使用Zeep。这是一个用Python编写的SOAP请求库。虽然它的文档也不是完美的,但比Suds的文档清晰多了。
4
来自 Ishpeck 的回答是个不错的方向。我想再补充一些关于Suds内部工作原理的内容。
Suds客户端其实是建立在urllib2这个HTTP打开器上的一个大抽象层。HTTP客户端、cookie容器、请求头、请求和响应都存储在一个叫做 transport
的对象里。问题是,除了cookie容器里的cookies,其他的活动并没有被缓存或存储在这个transport对象里,有时候追踪这些也会遇到麻烦。
如果你想在调试时了解发生了什么,我建议你在代码中加入以下内容:
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Suds使用了原生的 logging
模块,通过开启调试日志,你可以看到所有底层活动的详细信息,包括请求头、变量、负载、网址等等。这在很多时候帮了我大忙。
除此之外,如果你真的需要准确追踪请求头的状态,你需要创建一个 suds.transport.http.HttpTransport
对象的自定义子类,重写一些默认行为,然后把这个自定义类传给 Client
的构造函数。
下面是一个超级简单的示例:
from suds.transport.http import HttpTransport, Reply, TransportError
from suds.client import Client
class MyTransport(HttpTransport):
# custom stuff done here
mytransport_instance = MyTransport()
myclient = Client(url, transport=mytransport_instance)
4
我觉得你其实应该去查看一下“饼干罐”里的东西。
client = Client(url)
login_res = client.service.Login("login", "password")
for c in client.options.transport.cookiejar:
if "sess" in str(c).lower():
print "Session cookie:", c
我不太确定。我自己也是个SUDS的新手。不过这是我直觉告诉我的。