Creación de un MockService REST asincrónico en SoapUI con lanzamiento en Portainer

Tarea

Desarrolle un simulacro para probar la mensajería asincrónica con un sistema externo.





Como ejemplo, considere un caso de verificación de la validez de un código promocional mediante un sistema externo. Paso a paso:





1) Enviamos una solicitud al servicio de un sistema externo;





La solicitud PUT contiene campos (por ejemplo, en encabezados):





  • PromocionalCode = correctPromotionalCode





  • correlationId = una cadena aleatoria que se devolverá a la devolución de llamada





  • replyTo = dirección del servicio que recibe la devolución de llamada





2) El sistema externo responde sincrónicamente - 204 Sin contenido;





3) Después de 5 segundos, el sistema externo envía una devolución de llamada asincrónica (a la dirección replyTo de la solicitud):





Solicitud POST con cuerpo del mensaje:





  • status = "éxito" si el código promocional de la solicitud es "correctPromotionalCode", de lo contrario "validationError" 





  • correlationId = correlationId de la consulta





Decisión

Para resolver este problema, usamos SoapUI. Esta herramienta es bastante flexible en términos de creación de moxervices "inteligentes", ya que le permite escribir scripts tanto en las etapas de inicio / detención de moxervice (Start Script / Stop Script) como antes / después de recibir una solicitud (OnRequest Script / AfterRequest Script ).





Empecemos:

1) Cree un nuevo proyecto en SoapUI, por ejemplo, "test-soapui-project" (o seleccione uno existente) y cree dos REST MockService para él.





El primero se llamará Validation REST MockService: simula un servicio de sistema externo:





  • Path , , "/SP/ValidationSystem",





  • Port ,





  • Host "localhost".





 





Validation Receiving CALLBACK REST MockService - callback ( "Validation REST MockService" ):





  Path , , "/SP/SpHost"











2)  Validation REST MockService :





  • PUT









  • Resource Path , , "/validation" 





  • Method Rest , PUT ( 1 )





  • PUT  204 No content





:





  • Http Status Code ,  "204 - No Content",





  •   Content | Media type , "application/json".





  • Properties:





promotionalCode, replyTo, correlationId   PUT.





  • OnRequest Script - 204 No content ( 2 ). Properties:





*log.info  ,   script log.





  • AfterRequest Script - . callback , ( 5 ), callback replyTo ( 3 ):





:





log.info" Afterequest Script  - "
import java.lang.Exception
//    callback' ,    Properties
def replyTo = context.mockService.getPropertyValue('replyTo')
def correlationId = context.mockService.getPropertyValue('correlationId')
def promotionalCode = context.mockService.getPropertyValue('promotionalCode')
def status = "testStatus"
if ( promotionalCode.contains("correctPromotionalCode")){
status="success"
}
else
{
status="validationError"
}

// 
Thread.sleep(5000)

log.info"  callback"

//  callback -  POST
def conn = new URL(replyTo).openConnection();
def message = """\
{
"status":"${status}",
"correlationId":"${correlationId}"
}
"""
conn.setRequestMethod("POST")
conn.setDoOutput(true)
conn.setRequestProperty("Content-Type", "application/json")
conn.getOutputStream().write(message.getBytes("UTF-8"));
def postRC = conn.getResponseCode();
println(postRC);
if(postRC.equals(200)) {
println(conn.getInputStream().getText());
}

log.info"  callback"

log.info" Afterequest Script  - "
      
      



3)  Validation Receiving CALLBACK REST MockService  :





  • POST





:





  •   Resource Path , , "/callback"





  •   Method Rest , POST.





  • POST  200 OK





:





  •   Http Status Code ,  "200 - OK",





  • Content | Media type , "application/json".





  • OnRequest Script - , callback , :





4)





5)





, , Postman:





  • PUT validation 1 (Validation REST MockService), Headers 3 ,





  • replyTo callback - 2 (Validation Receiving CALLBACK REST MockService)





- 204 No Content.





script log SoapUI , callback 2:





Portainer:





1) images SoapUI:





  • docker hub .  fbascheper/soapui-mockservice-runner (https://hub.docker.com/r/fbascheper/soapui-mockservice-runner/)<o:p>





  • Portainer images









2)   :





  •  Compose file:





version: "3.7"
services: 
soapui-validation:
    image: fbascheper/soapui-mockservice-runner:latest
    volumes:
      - /soapui/soapui-prj:/home/soapui/soapui-prj
    environment:
      - MOCK_SERVICE_NAME=Validation REST MockService
      - PROJECT=/home/soapui/soapui-prj/test-soapui-project.xml
    ports:
      - 7703:8080
      
      



:





image - docker hub (https://hub.docker.com/r/fbascheper/soapui-mockservice-runner/)





volumes - soapUI , : " ": " "





MOCK_SERVICE_NAME - soapUI





PROJECT - soapUI , : « " " volumes» + ( test-soapui-project)





ports -  ( port soapUI), " ": " "





* en nuestro ejemplo, el proyecto soapUI se colocó en el servidor en / soapui / soapui-prj /





  • vaya a Portainer en la sección Pilas,





  • agregar una nueva pila:





    - especificar en el campo Nombre cómo se nombrará nuestra pila, por ejemplo, sp-soapui-mocks,





    - copiar el texto del archivo Redactar en el editor web,





  • Implementa la pila.





Como resultado, se formará la pila sp-soapui-mocks, en la que se lanza el servicio especificado en el archivo de redacción:





Total

Conseguimos un moxervice asincrónico que satisface la tarea en cuestión. El servicio se lanza en un servidor común y está disponible para todos los participantes del proyecto. Por el momento, nos ayuda a desarrollar y probar la aplicación en ausencia de una API de sistema de terceros.








All Articles