#python #testing #soap #web.py #simplexmlrpcserver
#python #тестирование #soap #web.py #simplexmlrpcserver
Вопрос:
Я пытаюсь протестировать функцию в продукте компании. Наше программное обеспечение выполнит запрос SOAP следующим образом:
Заголовок запроса
POST /testfunction.php HTTP/1.1
Accept: application/soap xml, application/xml, text/xml
SOAPAction: "http://www.abc.com/testfunction#test"
Host: soap.abc.com
Content-Length: 461
Connection: Keep-Alive
Запрашивать содержимое
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction">
<SOAP-ENV:Body>
<ns1:test>
<productID>3</productID>
<productSubID>1</productSubID>
<version>1.0.1</version>
<serialNumber/>
<language>EN</language>
<daysLicensed>0</daysLicensed>
<daysLeft>0</daysLeft>
</ns1:test>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
И служба SOAP должна ответить:
Заголовок ответа
HTTP/1.1 200 OK
Server: nginx/0.7.67
Date: Mon, 02 May 2011 13:43:46 GMT
Content-Type: text/xml; charset=utf-8
Connection: keep-alive
X-Powered-By: PHP/5.3.3-1ubuntu9.3
Content-Length: 304
Content-encoding: gzip
Содержимое ответа
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction"><SOAP-ENV:Body><ns1:testResponse><result>1000</result></ns1:testResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Вначале я думал, что смогу просто создать веб-сервис на web.py и возвращает тот же ответ всякий раз, когда кто-то делает запрос POST наhttp://www.abc.com/testfunction.
import web
url = (
'/testfunction', 'testfunction',
)
class testfunction:
def POST(self):
web.header('Content-Type', 'text/xml; charset=utf-8')
return """<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction"><SOAP-ENV:Body><ns1:testResponse><result>1000</result></ns1:testResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
"""
app = web.application(url, globals())
if __name__== "__main__":
app.run()
Но это не сработало. Я думаю, что, возможно, это как-то связано с заголовком. Затем я попробовал с SimpleXMLRPCServer.
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
import xmlrpclib
class MyRequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/',)
def do_POST(self):
return SimpleXMLRPCRequestHandler.do_POST(self)
def test():
return "hello, world"
server = SimpleXMLRPCServer(
("0.0.0.0", 80),
requestHandler = MyRequestHandler,
)
server.register_function(test, 'test')
server.serve_forever()
но проблема в том, что я не знаю, как справиться с SOAPAction в заголовке, и клиент не использует здесь функцию test. Кто-нибудь может мне помочь? Большое спасибо!!
Обновить:
Наконец-то сделал это, используя следующий код:
from wsgiref.simple_server import WSGIServer, WSGIRequestHandler
def echo(environ, start_response):
status = "200 OK"
headers = [("Content-type", "text/xml")]
start_response(status, headers)
return ["""<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.abc.com/testfunction"><SOAP-ENV:Body><ns1:testResponse><result>1000</result></ns1:testResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>"""]
httpd = WSGIServer(('0.0.0.0', 80), WSGIRequestHandler)
httpd.set_app(echo)
httpd.serve_forever()
Это должно работать так же с web.py код, однако web.py никто этого не делает. В захваченном пакете в wireshark я обнаружил некоторый искаженный код («3bc» и «0) до и после содержимого xml, что-то связанное с кодировкой?
Ответ №1:
Вы могли бы использовать soaplib для создания реального SOAP-сервиса, который реализует ваш интерфейс и возвращает фиктивные данные. Это должно быть немного проще в обслуживании, чем создание рукописных статических ответов, и код не должен быть намного длиннее вашего примера на основе web.py.
Вот пример Hello World.
Комментарии:
1. Спасибо за ваш ответ! Даже несмотря на то, что я не использовал ваше решение в конце, но документ soaplib все равно стоит прочитать 🙂