SOAP, Python, suds

6

请推荐适用于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。


你是在寻求关于Python SOAP库的一般建议,还是需要针对suds的特定方面寻求帮助?请尽量提出具体问题。 - Roger Pate
3个回答

4

我认为你实际上想在 Cookie Jar 中查找。

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新手。但这就是我的直觉告诉我的。


+1 是因为这是正确的方向,假设 urllib2(Suds 原生使用的 opener)与 cookies 兼容。如果路径中有任何 302 重定向,那么所有的赌注都会失效,因为 urllib2 + 302 重定向 + cookies = 地狱。 - jathanism

4

Ishpeck的回答是正确的方向。我想补充一些关于Suds内部的事情。

Suds客户端是在urllib2 HTTP打开器之上的一个大而笨重的抽象层。HTTP客户端、cookiejar、头文件、请求和响应都存储在transport对象中。问题是,除了cookiejar中的cookies之外,没有任何活动被缓存或存储在传输中,甚至追踪这些也有时会有问题。

如果您想在调试时查看发生了什么,我的建议是将以下内容添加到您的代码中:

import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

Suds使用本地的logging模块,因此通过打开调试日志,您可以看到所有正在执行的活动,包括标题、变量、负载、URL等。这节省了我大量的时间。

除此之外,如果您真的需要明确跟踪标头上的状态,则需要创建一个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)

0

我认为Suds库的文档很差,所以我建议你使用Zeep。它是Python中的SOAP请求库。它的文档不完美,但比Suds Doc清晰得多。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接