Web services SoapUI REST模拟服务在模拟以根据请求值处理动态响应时会给出错误(但相同的方法适用于SOAP模拟)

Web services SoapUI REST模拟服务在模拟以根据请求值处理动态响应时会给出错误(但相同的方法适用于SOAP模拟),web-services,rest,soap,mocking,soapui,Web Services,Rest,Soap,Mocking,Soapui,我试图使用soapUI模拟以下RESTWeb服务 样本请求: <Request> <HistoricTxn> <reference>E1</reference> <method>txn</method> </HistoricTxn> </Request> 不幸的是,当我尝试点

我试图使用soapUI模拟以下RESTWeb服务

样本请求:

   <Request>
            <HistoricTxn>
                <reference>E1</reference>
                <method>txn</method>
            </HistoricTxn>
    </Request>
不幸的是,当我尝试点击对这个REST模拟服务端点的请求时,它返回了一个错误。 错误:

com.eviware.soapui.impl.wsdl.mock.DispatchException:未能 使用脚本进行调度;java.lang.NullPointerException:无法调用 空对象上的方法getRequestContent()


我知道错误消息说getRequestContent()返回了一个空值,因此我得到了这个异常。但SOAP模拟服务也是如此,不会返回空值或导致异常。感谢您为克服此问题而采取的任何变通方法。

我刚刚发现,mockRequest.getRequestContent()为所有发送到REST web服务的POST、PUT、DELETE请求返回null,这些请求使用soapUI(版本5.2.1)模拟

由于上述(RequestContent)返回null,soapui无法计算以下标记的值

def reference = holder.getNodeValue("//reference");
soapUI此错误在soapUI(版本5.2.1)中的官方参考:


我刚刚在soapUI(版本5.2.1)中找到了克服上述缺陷的解决方法

至此,我清楚地看到,我可以使用mockRequest.getRequest().getReader().readLine()脚本读取请求正文中的一行。(尽管mockRequest.getRequestContent()返回了一个空对象)

我只需要使用下面的groovy脚本访问请求主体

def requestBody="";
  try {
       while ((line = mockRequest.getRequest().getReader().readLine()) != null){
                  requestBody = requestBody+line;
       }
  } catch (Exception e) { 
   log.error("exception:"+e)
  }

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
def holder = groovyUtils.getXmlHolder(requestBody); 

def reference = holder.getNodeValue("//reference");
根据上面的脚本,它必须逐行读取请求正文,然后合并所有行以获得整个请求正文

由于请求正文不再为null,下面的脚本可以计算引用标记中的值

def reference = holder.getNodeValue("//reference");
最终,我能够根据以下条件使用动态响应模拟REST模拟服务

if(reference == "Success"){
    return "SampleResponse1";
} else {
    return "SampleResponse2";
}

希望您可以通过使用此方法节省大量时间。

您说它可以从soapui中工作。那么,当你得到错误时?i、 例如,在哪里部署导致错误的服务?嗨,Rao,是的,groovy脚本适用于soapUI中的SOAPWeb服务模拟。但当我为RESTWeb服务模拟编写相同类型的groovy脚本时,情况并非如此。(使用http PUT方法)。Web服务尚未部署。我只是通过按下soapUI模拟服务窗口中的绿色播放按钮来启动模拟服务。
def reference = holder.getNodeValue("//reference");
def requestBody="";
  try {
       while ((line = mockRequest.getRequest().getReader().readLine()) != null){
                  requestBody = requestBody+line;
       }
  } catch (Exception e) { 
   log.error("exception:"+e)
  }

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);
def holder = groovyUtils.getXmlHolder(requestBody); 

def reference = holder.getNodeValue("//reference");
def reference = holder.getNodeValue("//reference");
if(reference == "Success"){
    return "SampleResponse1";
} else {
    return "SampleResponse2";
}