Actualizar el modelo del cliente usando servicios web

Última actualización:

Si usted precisa mantener al día los datos de sus clientes utilizando los resultados provenientes de servicios SOAP o REST, Prisma Campaigns provee los medios para hacerlo. Este artículo explica cómo actualizar campos del modelo utilizando la respuesta de un servicio web, ya sea en formato JSON o XML. Es importante destacar que los conceptos que se detallan a continuación aplican al modelo de cliente tanto a nivel global como de campaña, aunque se requiere que el valor obtenido sea consistente con el tipo de dato.

Indicar campos a actualizar

En primer lugar, es necesario establecer los campos a actualizar desde el funnel de campaña. Para hacerlo, siga estos pasos:

  1. Agregue un nuevo paso del tipo servicio web en el funnel.
  2. Ingrese una descripción y la dirección del servicio web correspondiente.
  3. Marque la casilla de verificación Update fields with response.
  4. En la pestaña Update, añada la cantidad de campos que se deseen actualizar haciendo clic en el botón Add field to update.
  5. Seleccione el campo correspondiente para cada caso. Por el momento, deje en blanco las expresiones asociadas.

En la imagen siguiente se aprecia un paso del funnel con la descripción Update customer que emplea la respuesta de la dirección https://api.bankofholland.com/get-customer para actualizar phone y owns_home:

En la próxima sección agregaremos las expresiones necesarias para extraer los valores deseados de los resultados provistos por el servicio web.

Agregar expresiones

Debido a que se espera que la respuesta del servicio web tenga una estructura compleja (JSON o XML), se emplean expresiones contra el resultado completo para seleccionar los valores de interés. En cualquiera de los casos, existen 3 funciones que permiten realizar esta tarea (node-exists, node-count y node-value) empleando los selectores apropiados según se detalla más adelante.

JSON

Usaremos como ejemplo la siguiente respuesta en formato JSON para ilustrar el uso de expresiones para la extracción de valores:

{
  "documentTypes": [
    {
      "documentTypeDescription": "RUT",
      "documentTypeId": 1
    },
    {
      "documentTypeDescription": "CÉDULA DE IDENTIDAD",
      "documentTypeId": 3
    },
    {
      "documentTypeDescription": "PASAPORTE",
      "documentTypeId": 10
    }
  ],
  "operationResult": {
    "value": "0",
    "valueName": "success",
    "isEnum": "true"
  }
}

Las funciones json-node-exists, json-node-count y json-node-value llevan a cabo la selección por parámetro siguiendo la sintaxis definida por el projecto JSON PATH. Por ejemplo:

Expresión Resultado
json-node-value("$.operationResult.value") 0
json-node-exists("$.documentTypes") true
json-node-exists("$.documentTypeId") false
json-node-exists("$..documentTypeId") true (este campo está presente en el segundo nivel)
json-node-value("$..documentTypeId") 1 (el primer valor encontrado de acuerdo al selector)
json-node-count("$..documentTypeId") 3 (examina el segundo nivel y regresa la cantidad de objetos que posean el selector dado)
json-node-count("$.documentTypeId") 0
json-node-value("$.documentTypes[1].documentTypeId") 3 (valor presente en el índice 1 de la colección)
json-node-value("$.documentTypes[7].documentTypeId") nil

Siguiendo el mismo patrón, suponga que el servicio web que usted emplea devuelve la siguiente respuesta:

{
  "phone": "+5491156898754",
  "owns_home": "No"
}

Como próximo paso, agregue las expresiones necesarias para actualizar los campos phone y owns_home:

json-node-value("$.phone")
json-node-value("$.owns_home")

Para finalizar, guarde los cambios haciendo click en Update.

XML

Si en vez de JSON la respuesta que se espera está dada en formato XML como los siguientes, emplearemos los selectores que se indican según el grado de complejidad y el valor que se desee seleccionar. En este caso, la sintaxis a utilizar se detalla aquí.

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:aut="http://www.bankofholland.com/middleware.services/authType" xmlns:con="http://www.bankofholland.com/middleware.services/queryClientTypes">
   <soapenv:Header>
      <aut:RequestHeader>
         <Authentication>
            <UserName>bankofholland</UserName>
            <Password>Holland202i$</Password>
         </Authentication>
         <Region>
            <SourceBank>HN01</SourceBank>
            <!--Optional:-->
            <DestinationBank></DestinationBank>
         </Region>
      </aut:RequestHeader>
   </soapenv:Header>
 <soapenv:Body>
      <con:queryClientRequest>
         <con:CUSTOMER_ID_TYPE>CUSTOMER_ID</con:CUSTOMER_ID_TYPE>
         <con:CUSTOMER_ID_VALUE>123654</con:CUSTOMER_ID_VALUE>
      </con:queryClientRequest>
     <con:queryClientRequest>
         <con:CUSTOMER_ID_TYPE>CUSTOMER_ID</con:CUSTOMER_ID_TYPE>
         <con:CUSTOMER_ID_VALUE>789654</con:CUSTOMER_ID_VALUE>
      </con:queryClientRequest>
   </soapenv:Body>
</soapenv:Envelope>

Por ejemplo:

  • xml-node-value("[:Password]") devolverá Holland202i$.
  • xml-node-exists("[:Region [:SourceBank]]") es true.
  • xml-node-count("[:con:queryClientRequest]") será igual a 2.

Por otro lado, si tenemos

<con:PHONE_INFO>
  <con:PHONE_NUMBER_ITEM>
    <con:PHONE_TYPE>PHONE</con:PHONE_TYPE>
    <con:PHONE_NUMBER>50422396410</con:PHONE_NUMBER>
    <con:PHONE_ORDER>1</con:PHONE_ORDER>
    <con:PHONE_EXTENSION />
    <con:PHONE_REFERRENCE>WORK</con:PHONE_REFERRENCE>
  </con:PHONE_NUMBER_ITEM>
  <con:PHONE_NUMBER_ITEM>
    <con:PHONE_TYPE>PHONE</con:PHONE_TYPE>
    <con:PHONE_NUMBER>50427663456</con:PHONE_NUMBER>
    <con:PHONE_ORDER>2</con:PHONE_ORDER>
    <con:PHONE_EXTENSION />
    <con:PHONE_REFERRENCE />
  </con:PHONE_NUMBER_ITEM>
  <con:PHONE_NUMBER_ITEM>
    <con:PHONE_TYPE>SMS</con:PHONE_TYPE>
    <con:PHONE_NUMBER>50499906860</con:PHONE_NUMBER>
    <con:PHONE_ORDER>3</con:PHONE_ORDER>
    <con:PHONE_EXTENSION />
    <con:PHONE_REFERRENCE>WORK</con:PHONE_REFERRENCE>
  </con:PHONE_NUMBER_ITEM>
</con:PHONE_INFO>

podemos hacer una extracción similar a la siguiente:

Obtener el valor del nodo llamado :con:PHONE_NUMBER, hijo de :con:PHONE_INFO y :con:PHONE_NUMBER_ITEM que contiene un nodo hijo con el valor SMS y otro con valor 3:

xml-node-value("[:con:PHONE_INFO [:con:PHONE_NUMBER_ITEM [(net.cgrand.enlive-html/has [(net.cgrand.enlive-html/text-pred #(= \"SMS\" %))])] [(net.cgrand.enlive-html/has [(net.cgrand.enlive-html/text-pred #(= \"1\" %))])]] [:con:PHONE_NUMBER]]")

En este escenario, el valor devuelto por el selector será 50499906860.

Artículos relacionados