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