SoapUI模拟服务:作为代理工作

SoapUI模拟服务:作为代理工作,soap,groovy,mocking,soapui,Soap,Groovy,Mocking,Soapui,我正在SoapUI中编写MockService 在接收到的SOAP请求(通过XPath)中存在节点的情况下,我希望通过groovy脚本生成响应。在其他情况下,我希望重定向收到的SOAP-请求。我的意思是,我希望将收到的SOAP-请求发送到其他SOAP-服务(我希望通过URL发送) 有办法做到这一点吗?如果您想使用您的soapUIMockService作为代理,请执行以下操作: 在响应中创建占位符(例如${responseMessage}) 添加下面打印的脚本 def groovyUtils=

我正在
SoapUI
中编写
MockService

在接收到的
SOAP
请求(通过
XPath
)中存在节点的情况下,我希望通过
groovy
脚本生成响应。在其他情况下,我希望重定向收到的
SOAP
-请求。我的意思是,我希望将收到的
SOAP
-请求发送到其他
SOAP
-服务(我希望通过
URL
发送)


有办法做到这一点吗?

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

  • 在响应中创建占位符(例如
    ${responseMessage}
  • 添加下面打印的脚本
  • def groovyUtils=new com.eviware.soapui.support.groovyUtils(上下文)
    //加载JKS(需要https)
    def keyStorePath=“keystore.jks”
    def keyStorePassword=“keystore\u pswd”
    def trustStorePath=“truststore.jks”
    def trustStorePassword=“truststore\u 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=新文件输入流(keystRepath)
    load(keyInput,KeyRepassword.toCharArray())
    keyInput.close()
    def trustInput=新文件输入流(trustStorePath)
    load(trustInput,trustStorePassword.toCharray())
    trustInput.close()
    init(keyStore,keyStorePassword.toCharArray())
    init(信任库)
    def sslContext=javax.net.ssl.sslContext.getInstance(“TLS”)
    sslContext.init(Keystrefactory.getKeyManager()、trustStoreFactory.getTrustManager()、new java.security.SecureRandom())
    def sslFactory=sslContext.getSocketFactory()
    //将收到的请求发送到https://example.org/soap/service
    def soapRequest=mockRequest.requestContent
    def soapUrl=新URL(“https://example.org/soap/service")
    def connection=soapUrl.openConnection()
    connection.setRequestMethod(“POST”)
    connection.setRequestProperty(“内容类型”、“文本/html”)
    connection.setRequestProperty(“SOAPAction”和“”)
    连接。设置插座工厂(SSL工厂)
    connection.doOutput=true
    Writer Writer=newoutputstreamwriter(connection.outputStream);
    writer.write(soapRequest)
    writer.flush()
    writer.close()
    connection.connect()
    def soapResponse=connection.content.text
    def responseExpathHelper=groovyUtils.getXmlHolder(soapResponse)
    响应ExpathHelper.declareNamespace(“信封”http://www.w3.org/2003/05/soap-envelope")
    响应expathHelper.declareNamespace(“msg”https://example.org/soap/service")
    //在这里,您可以修改条件(您想要欺骗的地方)
    if(“exampleress”.equals(responseExpathHelper[”/Envelope:Envelope/Envelope:Body/*/local-name()“])//欺骗
    {
    def requestXPathHelper=groovyUtils.getXmlHolder(mockRequest.requestContent)
    declareNamespace(“信封”http://www.w3.org/2003/05/soap-envelope")
    def messageValue=“欺骗响应:”+requestXPathHelper[/Envelope:Envelope/Envelope:Body/msg:exampleress/text()]
    def responseTemplate=“”
    ${messageValue}
    """
    requestContext.responseMessage=responseTemplate
    }
    //作为代理工作,即只返回从example.org/soap/service收到的响应
    else requestContext.responseMessage=soapResponse
    
    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