【发布时间】:2019-01-29 15:58:34
【问题描述】:
我使用 python 2.7 的 Spyne 库编写了一个 SOAP 服务器。这是我的服务器:
import logging
import random
import string
import json
from spyne.decorator import rpc
from spyne.application import Application
from spyne.service import ServiceBase
from spyne.model.primitive import Integer, String, Long
from spyne.server.wsgi import WsgiApplication
from spyne.protocol.soap import Soap11
from wsgiref.simple_server import make_server
class merchantservicesSoap(ServiceBase):
@rpc(Integer, String, Long, _returns=String)
def CheckTransactionResult(ctx, merchantConfigurationID, encryptedCredentials, localInvoiceID):
return json.dumps(
{
"Result": 500,
"CardNumber": '-'.join([
''.join(random.sample(string.digits.replace('0', ''), 4)),
'00' + ''.join(random.sample(string.digits, 2)),
'0000',
''.join(random.sample(string.digits, 4))
]),
"RRN": ''.join(random.sample(string.digits.replace('0', ''), 8)) * 2,
"RefID": random.randint(10000, 500000),
"Amount": random.randint(10000, 500000),
"PayGateTranID": ''.join(random.sample(string.digits.replace('0', ''), 8)) * 2,
"SalesOrderID": localInvoiceID
}
)
application = Application(
[merchantservicesSoap],
tns='http://tempuri.org/',
in_protocol=Soap11(validator='lxml'),
out_protocol=Soap11()
)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('spyne.util').setLevel(logging.DEBUG)
wsgi_app = WsgiApplication(application)
server = make_server('0.0.0.0', 55555, wsgi_app)
server.serve_forever()
我也有一个客户端来调用它的方法,但是我得到了一个错误。这是我的客户:
import logging
from suds.client import Client
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('spyne.client').setLevel(logging.DEBUG)
c = Client('http://127.0.0.1:55555/?wsdl')
print c.service.CheckTransactionResult(5, 'zizi', 8888)
这是错误:
Traceback (most recent call last):
File "client.py", line 9, in <module>
print c.service.CheckTransactionResult(5, 'zizi', 8888)
File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 602, in invoke
result = self.send(soapenv)
File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 649, in send
result = self.failed(binding, e)
File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 702, in failed
r, p = binding.get_fault(reply)
File "/usr/local/lib/python2.7/dist-packages/suds/bindings/binding.py", line 265, in get_fault
raise WebFault(p, faultroot)
suds.WebFault: Server raised fault: 'Internal Error'
我设置了一些断点,我意识到请求根本没有到达服务器;这意味着我的请求有问题,不符合服务器原型。但据我所知,客户端请求已满足定义;我在这里遗漏了什么吗?
【问题讨论】:
-
能不能把服务器端的traceback也放上去?
-
@BurakArslan,感谢您的关注。我已经解决了这个问题。
标签: python python-2.7 soap suds spyne