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

SoapUI MockService:作为代理工作

发布时间:2020-12-14 16:22:47 所属栏目:大数据 来源:网络整理
导读:我在SoapUI中编写MockService. 如果节点存在于收到的SOAP请求中(通过XPath),我希望通过groovy脚本生成响应.在其他情况下,我想重定向收到的SOAP-Request.我的意思是,我希望将收到的SOAP-Request发送到其他SOAP-Service(我希望通过URL发送). 有办法做到这一点
我在SoapUI中编写MockService.

如果节点存在于收到的SOAP请求中(通过XPath),我希望通过groovy脚本生成响应.在其他情况下,我想重定向收到的SOAP-Request.我的意思是,我希望将收到的SOAP-Request发送到其他SOAP-Service(我希望通过URL发送).

有办法做到这一点吗?

解决方法

如果要使用soapUI MockService作为代理,请执行以下操作:

  1. Create placeholder in response (for example ${responseMessage})
  2. Add script that printed below
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )

// load JKS (need for https)
def keyStorePath = "keystore.jks"
def keyStorePassword = "keystore_pswd"
def trustStorePath = "truststore.jks"
def trustStorePassword = "truststore_pswd"

def keyStoreFactory = javax.net.ssl.KeyManagerFactory.getInstance("SUNX509")
def trustStoreFactory = javax.net.ssl.TrustManagerFactory.getInstance("SUNX509")
def keyStore = java.security.KeyStore.getInstance("JKS")
def trustStore = java.security.KeyStore.getInstance("JKS")

def keyInput = new FileInputStream(keyStorePath)
keyStore.load(keyInput,keyStorePassword.toCharArray())
keyInput.close()

def trustInput = new FileInputStream(trustStorePath)
trustStore.load(trustInput,trustStorePassword.toCharArray())
trustInput.close()

keyStoreFactory.init(keyStore,keyStorePassword.toCharArray())
trustStoreFactory.init(trustStore)

def sslContext = javax.net.ssl.SSLContext.getInstance("TLS")
sslContext.init(keyStoreFactory.getKeyManagers(),trustStoreFactory.getTrustManagers(),new java.security.SecureRandom())

def sslFactory = sslContext.getSocketFactory()

// Send received request to https://example.org/soap/service
def soapRequest = mockRequest.requestContent
def soapUrl = new URL("https://example.org/soap/service")
def connection = soapUrl.openConnection()

connection.setRequestMethod("POST")
connection.setRequestProperty("Content-Type","text/html")
connection.setRequestProperty("SOAPAction","")
connection.setSSLSocketFactory(sslFactory)
connection.doOutput = true

Writer writer = new OutputStreamWriter(connection.outputStream);
writer.write(soapRequest)
writer.flush()
writer.close()
connection.connect()

def soapResponse = connection.content.text
def responseXPathHelper = groovyUtils.getXmlHolder(soapResponse)

responseXPathHelper.declareNamespace("envelop","http://www.w3.org/2003/05/soap-envelope")
responseXPathHelper.declareNamespace("msg","https://example.org/soap/service")

// Here you can modify condition (Where you want to spoofing)
if ("ExampleResponse".equals(responseXPathHelper["/envelop:Envelope/envelop:Body/*/local-name()"]))    // spoofing
{
    def requestXPathHelper = groovyUtils.getXmlHolder(mockRequest.requestContent)
    requestXPathHelper.declareNamespace("envelop","http://www.w3.org/2003/05/soap-envelope")

    def messageValue = "spoofed response : " + requestXPathHelper[/envelop:Envelope/envelop:Body/msg:ExampleResponse/text()]

    def responseTemplate = """<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
        <S:Body>
            <ExampleResponse xmlns="https://example.org/soap/service">
                ${messageValue}
            </ExampleResponse>
        </S:Body>
    </S:Envelope>"""

    requestContext.responseMessage = responseTemplate
}
// work as proxy,i.e. just return response recieved from example.org/soap/service
else     requestContext.responseMessage = soapResponse

(编辑:李大同)

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

    推荐文章
      热点阅读