0

我正在尝试使用 Spyne 和 Suds 的组合(尽管我对使用 Suds 不是很特别)来创建一个模块,该模块充当两个 SOAP 实体之间的中间人。

有一个客户端C,它连接到服务器S,调用一个方法M,返回一个ComplexType,D。同样的数据对象需要S发送到另一个服务器S1。当然,在服务器 S1 上有一个方法 M1,它以 D 类型作为参数。我面临的问题是我不能只将 D 发送到 S1,而不转换为 Suds 识别的类型。

有没有一种聪明的方法来做到这一点,而无需逐个字段地将 D 的属性从一种“类型”复制到另一种?

4

3 回答 3

0

您可以将 D 类型的对象转换为 dict 并将 dict 传递给服务方法,Suds 采用尊重对象结构的 dicts:https ://fedorahosted.org/suds/wiki/Documentation#ComplexArgumentsUsingPythondict

要转换为 dict 您可以使用此处的代码:Recursively convert python object graph to dictionary

IE:

    D_inst = S.service.M()
    D_dict = to_dict(D_inst)
    S1.service.M1(D_dict)
于 2013-08-02T00:18:47.747 回答
0

您确实可以将传入的对象转换为 dicts 并将它们传递给 suds。但是 Spyne 已经提供了两种方式 object<==>dict 转换工具。

要转换为 dict,您可以使用spyne.util.dictdoc.

例如

from spyne.model.complex import ComplexModel
from spyne.model.primitive import Integer

class B(ComplexModel):
    c = Integer

class A(ComplexModel):
    a = Integer
    b = B 

from spyne.util.dictdoc import get_object_as_dict
print get_object_as_dict(A(a=4, b=B(c=5)), A)
# prints {'a': 4, 'b': {'c': 5}}

get_object_as_dict(A(a=4, b=B(c=5)), A, ignore_wrappers=False)
# prints {'A': {'a': 4, 'b': {'B': {'c': 5}}}}

我希望它有所帮助。

于 2013-08-02T16:04:25.090 回答
0

Suds 在解析复杂对象时存在很大问题。

例如

class C(ComplexModel):
    d = Integer

class B(ComplexModel):
    c = Array(C)

class A(ComplexModel):
    a = Integer
    b = B 

在这种情况下,使用get_object_to_dictto 转换为字典功能正常,但 suds 无法调用 SOAP 方法并失败并显示Type not found 'c'.

于 2013-08-04T16:17:52.413 回答