我正在尝试使用SUDS和

Python与SOAP Web服务进行通信.经过大量学习Python的麻烦(是的,我是新手),并研究如何使用SUDS,我遇到了一个问题.

根据肥皂泡沫,我呼吁的网络方法的签名是

(FWTCaseCreate){

ClassificationEventCode = None

Priority = None

Title = None

Description = None

Queue = None

DueDate = None

AssociatedObject =

(FWTObjectBriefDetails){

ObjectID =

(FWTObjectID){

ObjectType = None

ObjectReference[] =

}

ObjectDescription = None

Details = None

Category = None

}

Form =

(FWTCaseForm){

FormField[] =

FormName = None

FormKey = None

}

Internal = None

InteractionID = None

XCoord = None

YCoord = None

}

所以我使用SUDS创建我想要的类并将其发送到方法.但是我收到了一个错误.所以我开启登录,我可以看到正在发送的XML不正确,导致反序列化错误.

SOAP包如下所示

eaadf1ddff99a8

2000023

1

testing

testing

True

356570

168708

你可以看到有一个

‘ClassificationEventCode’

围绕所有其他元素的元素,这不应该存在.如果我将此xml剪切并粘贴到SOAPUI中,并首先删除此元素,然后将其直接发布到Web服务,它就能成功运行.

这是我用来拨打电话的代码

client = Client(url)

#Add a header for the security

ssnns = ('wsse', 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd')

ssn = Element('BinarySecurityToken', ns=ssnns).setText(binaryKey)

ssn1 = Element('Security',ns=ssnns)

ssn1.append(ssn)

client.set_options(soapheaders=ssn1)

newCase = client.factory.create('ns1:FWTCaseCreate')

classEventCode = client.factory.create('ns1:FWTEventCode')

classEventCode.value = 2000023

newCase.ClassificationEventCode = classEventCode

newCase.Priority = 1

#optional

newCase.AssociatedObject = None

#optional

newCase.Form = None

#optional

newCase.Internal = None

#optional

newCase.InteractionID = None

#optional

newCase.DueDate = None

#optional

newCase.Queue = None

newCase.Title = 'Title'

newCase.Description = 'description'

newCase.XCoord = '356570'

newCase.YCoord = '168708'

caseID = client.service.createCase(newCase)

有没有人有任何想法为什么会这样?我猜SUDS认为它应该基于WSDL.

谢谢.

最佳答案 我得到了完全相同的问题.我的SOAP请求中的参数序列被包装在一个与第一个参数同名的元素中.例如

....

1

Mr

....

....

我检查了WSDL,以确保它没有问题.

看起来问题是因为我使用client.factory.create方法创建了一个CreationReq对象.通过打印检查客户端显示我正在调用的方法不将该对象作为参数.而是需要一个名为args的列表.

所以我的代码是:

req = client.factory.create('CreationReq')

req.ReqType = 1

req.Title = 'Mr'

resp = client.service.Create(req)

现在它是:

req = {}

req['ReqType'] = 1

req['Title'] = 'Mr'

resp = client.service.Create(**req)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐