Я написал SOAP-сервер, используя Spyne
библиотеку Python 2.7.Это мой сервер:
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'
Я установил несколько точек останова и понял, что запрос вообще не достигает сервера;что означает, что с моим запросом что-то не так, что не соответствует прототипам сервера.Но, насколько мне известно, клиентский запрос встретил определения;я что-то здесь упускаю?