gpt4 book ai didi

python - Django - 带有 soap lib xml 字符或符号转义的 Web 服务?

转载 作者:太空狗 更新时间:2023-10-30 01:02:44 25 4
gpt4 key购买 nike

好吧,这是我的第一个问题,所以我会尽力做到最好。

我正在尝试使用 Soaplib 2.0 在 Python 2.6 和 Django 1.4 中实现 WebService 服务器。

Web 服务正在运行,Django 在 Django 开发服务器中正常提供服务。

这是 Django View 和 Urls 的代码:

views.py

from soaplib.core.service import rpc, DefinitionBase, soap
from soaplib.core.model.primitive import String, Integer, Boolean
from soaplib.core.model.clazz import Array
from soaplib.core import Application
from soaplib.core.server.wsgi import Application as WSGIApplication
from django.http import HttpResponse

class HelloWorldService(DefinitionBase):
@soap(String,Integer,_returns=Array(String))
def say_smello(self,name,times):
results = []
for i in range(0,times):
results.append('Hello, %s'%name)
return results
@soap(String,_returns=Boolean)
def xml(self,xml):
result = xml
return True
@soap(String,_returns=String)
def xml2(self,xml2):
return xml2



class DjangoSoapApp(WSGIApplication):
csrf_exempt = True

def __init__(self, services, tns):
"""Create Django view for given SOAP soaplib services and
tns"""

return super(DjangoSoapApp,
self).__init__(Application(services, tns))

def __call__(self, request):
django_response = HttpResponse()

def start_response(status, headers):
django_response.status_code = int(status.split(' ', 1)[0])
for header, value in headers:
django_response[header] = value

response = super(DjangoSoapApp, self).__call__(request.META,
start_response)
django_response.content = '\n'.join(response)

return django_response

my_soap_service = DjangoSoapApp([HelloWorldService], __name__)

urls.py

url(r'^soap/wsdl$', 'soap.views.my_soap_service'),
url(r'^soap/$', 'soap.views.my_soap_service'),

问题是,我想将 XML 传递给 WebService 方法 xml 或 xml2,然后使用 XML 中的信息进行处理。我收到错误。

如果我传递一个没有像“&”这样的字符的简单字符串,一切正常,例如:

首先让我们导入 suds 并将 suds 设置为调试:

from suds.client import Client
import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

现在让我们开始调用 de WS:

WSDL = "http://server.test/soap/wsdl"
client = Client(WSDL)
client.service.xml('x and y')

工作完美,我得到“True”并且 SUDS 的日志显示我正在这样做:

DEBUG:suds.client:sending to (http://server.test/soap/wsdl)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="soap.views" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:xml>
<ns0:xml>x and y</ns0:xml>
</ns0:xml>
</ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': '"xml"', 'Content-Type': 'text/xml; charset=utf-8'}
DEBUG:suds.client:http succeeded:
<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s0="soap.views" xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/" xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"><senv:Body><s0:xmlResponse><s0:xml Result>true</s0:xmlResult></s0:xmlResponse></senv:Body></senv:Envelope>
True

但如果我这样做:

client.service.xml('x &  y')

不工作,它以泡沫超时结束并且服务器报告管道损坏,泡沫日志告诉我这是推送的内容:

DEBUG:suds.client:sending to (http://server.test/soap/wsdl)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="soap.views" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:xml>
<ns0:xml>x &amp; y</ns0:xml>
</ns0:xml>
</ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': '"xml"', 'Content-Type': 'text/xml; charset=utf-8'}

这是关于肥皂水的错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/site-packages/suds/client.py", line 542, in __call__
return client.invoke(args, kwargs)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 602, in invoke
result = self.send(soapenv)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 643, in send
reply = transport.send(request)
File "/usr/lib/python2.6/site-packages/suds/transport/https.py", line 64, in send
return HttpTransport.send(self, request)
File "/usr/lib/python2.6/site-packages/suds/transport/http.py", line 77, in send
fp = self.u2open(u2request)
File "/usr/lib/python2.6/site-packages/suds/transport/http.py", line 118, in u2open
return url.open(u2request, timeout=tm)
File "/usr/lib/python2.6/urllib2.py", line 391, in open
response = self._open(req, data)
File "/usr/lib/python2.6/urllib2.py", line 409, in _open
'_open', req)
File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain
result = func(*args)
File "/usr/lib/python2.6/urllib2.py", line 1190, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.6/urllib2.py", line 1165, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error timed out>

感谢此链接:http://grokbase.com/p/python/soap/125nhj9bdm/python-suds-xml-encoding-issue我发现是的,如果我发布类似以下内容的 WebService:

client.service.xml("x &amp;amp; y")

我做对了:

DEBUG:suds.client:sending to (http://server.test/soap/wsdl)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="soap.views" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:xml>
<ns0:xml>x &amp;amp; y</ns0:xml>
</ns0:xml>
</ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': '"xml"', 'Content-Type': 'text/xml; charset=utf-8'}
True

如果我使用 xml2 方法,那么我可以看到返回 WebService 的内容是这样的:

client.service.xml2("x &amp;amp; y")

Suds 的日志:

DEBUG:suds.client:sending to (http://server.test/soap/wsdl)
message:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="soap.views" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<ns1:Body>
<ns0:xml2>
<ns0:xml2>x &amp;amp; y</ns0:xml2>
</ns0:xml2>
</ns1:Body>
</SOAP-ENV:Envelope>
DEBUG:suds.client:headers = {'SOAPAction': '"xml2"', 'Content-Type': 'text/xml; charset=utf-8'}


DEBUG:suds.client:http succeeded:
<?xml version='1.0' encoding='utf-8'?>
<senv:Envelope xmlns:wsa="http://schemas.xmlsoap.org/ws/2003/03/addressing" xmlns:plink="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:senc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s0="soap.views" xmlns:s12env="http://www.w3.org/2003/05/soap-envelope/" xmlns:s12enc="http://www.w3.org/2003/05/soap-encoding/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"><senv:Body><s0:xml2Response><s0:xml2Result>x &amp; y</s0:xml2Result></s0:xml2Response></senv:Body></senv:Envelope>
x & y

但我不认为问题出在 SUDS 中,因为我使用这个版本的 suds 将 XML 推送到 java WebServices,但是我还没有找到这个 soaplib 的方法。

有什么想法吗?这让我有点抓狂 xD

我的最终目标是让 Web 服务带有 Soaplib,并从 Java 的 soap 客户端向它推送 XML。

谢谢

最佳答案

好的,解决了:D

我只能更改服务器端,所以我将我的代码迁移到 spyne 并像 Charm 一样工作。

https://github.com/arskom/spyne

我在他们的网站上找到了这个:

 Soaplib-2.0 was never released as a stable package, but the branch is still available

他们从 soaplib 转到 Rpclib,然后从那里转到 Spyne。

我确实发现了一个新错误,这次是关于 suds,但 suds 我只是用于测试,但如果我使用其他客户端,SoapUI 或 Java 客户端,效果很好。

使用 PIP 安装后,这是 Django 代码:

urls.py

url(r'^testws/\?wsdl$', 'testmo.views.ws_test'),
url(r'^testws/$', 'testmo.views.ws_test'),

views.py

from django.views.decorators.csrf import csrf_exempt
from spyne.server.django import DjangoApplication
from spyne.model.primitive import String
from spyne.service import ServiceBase
from spyne.interface.wsdl import Wsdl11
from spyne.protocol.soap import Soap11
from spyne.application import Application
from spyne.decorator import srpc



class ServiceWsTest(ServiceBase):
@srpc(String, _returns=String)
def testMethod(string):
return string

ws_test = csrf_exempt(DjangoApplication(Application([ServiceWsTest],
'http://example.com',
in_protocol=Soap11(),
out_protocol=Soap11(),
interface=Wsdl11(),
)))

从现在开始,我会继续使用这个库

关于python - Django - 带有 soap lib xml 字符或符号转义的 Web 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13937592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com