CON3 - Escribir tu propio conector (HTTP)
|
Comenzando
Este paso del tutorial utiliza como punto de partida la solución "add_kafka" del proyecto. Si en cualquier momento quieres ver la solución de este paso, la encontrarás en la solución "add_http". |
En CON2 - Escribir tu propio conector (Kafka), conectamos nuestra aplicación con un sistema externo de sanciones para realizar peticiones. Para ello, creamos nuestro propio conector Kafka y lo usamos para enviar peticiones y recibir respuestas sobre Kafka. En este tutorial, vamos a cambiar de protocolo y a usar HTTP.
Una diferencia importante con el ejemplo anterior es que, mientras que con Kafka usábamos el conector de forma asíncrona, esta vez necesitamos realizar una llamada HTTP síncrona. Esto significa que debemos usar un tipo distinto de conector: el "RequestReplyConnector".
Integraremos un sistema de fraude de prueba. Este sistema:
-
Espera recibir un objeto
OlafRequestpersonalizado. -
Devolverá un objeto
OlafResponsepersonalizado.
Clases de soporte
Lo primero que haremos será importar la definición de dominio para el sistema de fraude. Para ello añadimos una dependencia en el pom.xml de la aplicación:
<dependency>
<artifactId>fraud-domain</artifactId>
<groupId>com.iconsolutions.ipf.sample.samplesystems</groupId>
</dependency>
Veamos las clases clave que recibimos de este módulo. La primera es el objeto de petición que enviamos al sistema de fraude.
@Data
public class OlafRequest extends SampleEvent<OlafRequestPayload> {
}
Si exploramos un poco más, encontramos que el elemento clave del payload es FraudRequest:
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FraudRequest {
ObjectNode fiToFICstmrCdtTrf;
}
Aquí vemos que espera que le proporcionemos un pacs.008 en formato ObjectNode (representación Jackson del pacs.008).
Mapeo
En el ejemplo de Kafka usamos un mapper preempaquetado para convertir de nuestro pacs.008 al OlafRequest. Aquí, como ejemplo de otro enfoque, escribiremos nuestro propio mapper.
Creamos una clase de mapeo que pueda tomar nuestro pacs.008 y crear el FraudRequest. Usaremos el método valueToTree del Jackson ObjectMapper para construir FraudRequest y lo envolveremos en OlafRequest.
El objeto OlafRequest espera un header que debe contener un technical.eventId y un bloque functional. Un ejemplo de implementación sería:
@AllArgsConstructor
public class FraudMapper {
private final Config config;
private final String prefix;
private final ObjectMapper objectMapper;
public OlafRequest mapToRequest(FIToFICustomerCreditTransferV08 fiToFICustomerCreditTransfer) {
FraudRequest fraudRequest = new FraudRequest();
fraudRequest.setFiToFICstmrCdtTrf(objectMapper.valueToTree(fiToFICustomerCreditTransfer));
OlafRequest olafRequest = new OlafRequest();
olafRequest.setHeader(Header.builder()
.technical(Technical.builder().eventId("EventId").build())
.functional(Functional.builder().build())
.build());
olafRequest.setPayload(new OlafRequestPayload(fraudRequest));
return olafRequest;
}
public OlafResponse convertResponse(String messageText) {
try {
return objectMapper.readValue(messageText, OlafResponse.class);
} catch (JsonProcessingException e) {
throw new IconRuntimeException(e);
}
}
}
Conector Request/Reply HTTP (resumen)
-
Definimos un
RequestReplyConnectorque: -
Convierte
OlafRequesten unTransportMessage(payload String + cabeceras comohttpUrl,httpMethod, etc.). -
Envía el mensaje mediante un transporte HTTP (por ejemplo,
HttpConnectorTransport). -
Recibe la respuesta HTTP (String) y la convierte a
OlafResponseusando elFraudMapper. -
Devuelve un
DeliveryReportal flujo llamante. -
Configuración típica en
application.conf(host/port/endpoint del cliente HTTP) y, opcionalmente, ajustes de resiliencia como en Resiliencia y reintentos (HTTP).
Comprobación (resumen)
-
Construye la aplicación:
mvn clean install
-
Lanza la aplicación y envía un pago por el canal de iniciación.
-
Verifica en Developer App que la llamada HTTP se ha realizado (mensajes
OlafRequest/OlafResponse) y que el flujo progresa según lo esperado.
Conclusiones
Hemos visto cómo preparar los objetos de soporte, escribir un mapper sencillo y los conceptos básicos del conector Request/Reply HTTP. En la guía completa (original en inglés) encontrarás el detalle de las clases del conector, el transporte HTTP, cabeceras requeridas y la configuración específica por entorno. Si deseas que extienda esta traducción con todo el detalle paso a paso, lo hago en la siguiente iteración.