我正在尝试编写一个简单的肥皂服务器。我知道肥皂信封的样子(预定义)。对于服务器将服务的每个请求,我知道可选的soap 头、方法的名称和参数,并且我还知道soap 响应的样子(换句话说,WSDL 已定义)。
我想了解的是我的 spyne 服务应该是什么样子(从 ServiceBase 继承)来使用它。
这是我期待的肥皂请求示例:
<?xml version='1.0' encoding='UTF-8'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://resources.mydomain.com/soap/1.1">
<soap:Header>
<ns:myinfo>someinfo</ns:myinfo>
</soap:Header>
<soap:Body>
<ns:MyMethod>
<ns:mymethodparam>somevalue</ns:mymethodparam>
</ns:MyMethod>
</soap:Body>
</soap:Envelope>
目前,我正在做的只是通过 curl 发送上述信封。我得到的回应是:
<?xml version='1.0' encoding='UTF-8'?>
<tns:Envelope xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/">
<tns:Body>
<tns:Fault>
<faultcode>senv:Client.ResourceNotFound</faultcode>
<faultstring>Requested resource '{http://resources.mydomain.com/soap/1.1}MyMethod' not found</faultstring>
<faultactor></faultactor>
</tns:Fault>
</tns:Body>
</tns:Envelope>
根据 Burak Arslan 的建议,我正在使用的代码是:example.py:
from spyne.model.primitive import Boolean, Unicode, Integer
from spyne.model.complex import ComplexModelBase
from spyne.model.complex import ComplexModel
from spyne.model.complex import ComplexModelMeta
from spyne.service import ServiceBase
from spyne.decorator import rpc
import logging
class MyHeader(ComplexModel):
myinfo = Unicode
class MyMethodRequest(ComplexModel):
mymethodparam = Unicode
class SomeService(ServiceBase):
__in_header__ = MyHeader
@rpc(MyMethodRequest, _body_style='bare')
def MyMethod(request):
print "I got:", request.mymethodparam
我用来启动服务器的代码是:test_run.py:
from spyne.application import Application
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from wsgiref.simple_server import make_server
import logging
logging.basicConfig(level=logging.DEBUG)
logging.info('listening to http://127.0.0.1:8000')
application = Application([SomeService],
'http://schemas.xmlsoap.org/soap/envelope/',
in_protocol=Soap11(),
out_protocol=Soap11())
wsgi_application = WsgiApplication(application)
server = make_server('127.0.0.1', 8000, wsgi_application)
server.serve_forever()
我不确定的另一件事是我是否正确设置了 WSDL(在项目中的正确位置),但据我所知(我可能完全离开,我是肥皂和 spyne 的新手),这并不重要,只要我相应地构建 API(使用 spyne)。我对么?
我正在用 curl 提出请求:
curl --header "content-type: text/soap+xml; charset=utf-8" --data @example.xml http://127.0.0.1:8000
关于我做错了什么的任何指示?太感谢了!