加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何伪造Python中的soap响应?

发布时间:2020-12-20 11:18:37 所属栏目:Python 来源:网络整理
导读:我正在尝试测试公司产品中的功能.我们的软件将发出如下SOAP请求: 请求标题 POST /testfunction.php HTTP/1.1Accept: application/soap+xml,application/xml,text/xmlSOAPAction: "http://www.abc.com/testfunction#test"Host: soap.abc.comContent-Length:
我正在尝试测试公司产品中的功能.我们的软件将发出如下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中创建一个Web服务,并在有人在http://www.abc.com/testfunction发出POST请求时返回相同的响应.

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,而客户端在这里没有使用测试函数.谁能帮我?非常感谢!!

更新:

终于做到了,使用以下代码:

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',WSGIRequestHandler)
httpd.set_app(echo)
httpd.serve_forever()

它应该与web.py代码一样,但web.py没有.从wireshark中捕获的包中,我在xml内容之前和之后发现了一些乱码(“3bc”和“0”),与编码有关?

解决方法

您可以使用 soaplib创建一个真正的SOAP服务,该服务实现您的接口并返回虚拟数据.这应该更容易维护,然后创建手写静态响应,并且代码不应该比基于web.py的示例更长.

这是Hello World example.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读