Control de errores en las API HTTP
Este tema explica cómo controlar los errores HTTP en una asignación que llama a una API HTTP. Si desea controlar errores HTTP (por ejemplo, No encontrado, No autorizado), deberá definir un nodo body correspondiente en la parte response de la llamada al servicio web (ver detalles más abajo). De lo contrario, los errores HTTP terminarán siempre la ejecución de la asignación.
Implementación de llamadas a servicios web
En el ejemplo de asignación que se muestra a continuación, un archivo CSV denominado products.csv suministra los ID de los productos a la parte Request de la llamada al servicio web. Cuando se llama al servicio web, la respuesta que contiene los detalles recuperados se asigna a un archivo XML llamado output.xml.
Si los productos con los ID suministrados existen en el servidor, sus detalles se asignarán desde el cuerpo con el código de estado 200 (operación correcta). Si no hay productos con esos ID en el servidor, la llamada al servicio web devolverá el código de estado 404 (no encontrado) y la respuesta se asignará desde el cuerpo con el código de estado 404 al nodo ErrorMessage en el resultado.
Estructuras del cuerpo y de la respuesta
Para controlar diferentes respuestas HTTP del servicio web en la misma asignación, puede crear varios elementos Body de la siguiente manera: Haga clic con el botón derecho en el elemento Body del componente Servicio web y seleccione Agregar nodo de cuerpo delante/detrás en el menú contextual. En nuestro ejemplo, hay dos cuerpos y cada uno de ellos controla un tipo particular de respuesta HTTP: el cuerpo con el código de estado 200 contrla las respuestas correctas, mientras que el cuerpo con el código de estado 404 controla los errores No Encontrado.
Cada uno de los elementos Body de la respuesta se puede configurar gracias a sus respectivos botones . Al hacer clic en este botón, se abre el cuadro de diálogo Estructura de la respuesta (imágenes siguientes). Ambos cuerpos disponen de estructuras de respuesta en formato XML. Los cuerpos también pueden aceptar contenidos de otros tipos (por ejemplo, JSON).
Body status=200
Body status=404
Orden de procesamiento
En esta sección se explica cómo la asignación procesa la solicitud y emite la respuesta al documento de destino.
Contexto de destino común
De acuerdo con una de las reglas fundamentales de MapForce, el procesamiento comienza siempre desde el nodo raíz de destino y avanza hacia abajo en la jerarquía. En nuestro ejemplo, el nodo raíz de destino es ProductList. El nodo raíz de destino no está conectado, por lo que el procesamiento continúa con el elemento Product que está conectado al nodo Response de la llamada al servicio web. Con esta conexión, se establece un contexto de destino común para todos los descendientes del nodo Product. Esto significa que los descendientes tendrán acceso a los datos de sus primarios, lo que ayudará a evitar llamadas innecesarias.
Un producto por cada respuesta
Según otra regla fundamental de MapForce, por cada elemento de origen, se crea un elemento en el destino. En nuestro ejemplo, esto significa que por cada respuesta se creará un elemento Product en el resultado. Como regla general, especialmente con varios nodos Body configurados, normalmente querrá conectar el nodo Response a algún primario común en el destino. Así evitará hacer demasiadas llamadas.
Procesamiento de la solicitud/respuesta
Cuando se traza la conexión desde el nodo Product hasta el nodo Response, MapForce sabe que necesita hacer una llamada al servicio web, pero antes necesita una solicitud. Entonces se procesa la parte de solicitud. El parámetro id acepta valores del nodo ProductID del archivo CSV de origen.
El archivo CSV contiene una secuencia de valores que estamos intentando asignar al parámetro que espera un solo valor. En este caso, a la función del servicio web se le llamará tantas veces y producirá tantos resultados como elementos haya en la secuencia. Esto significa que si hay 5 ID de producto, se hará una llamada por cada ID.
Cuando se traza la conexión desde el nodo id hasta el nodo ProductID, MapForce trae a su primario, el nodo Rows, al contexto y recorre en bucle a cada fila (ProductID). Para cada fila, se enviará una solicitud al servidor. MapForce recibirá entonces una respuesta del servidor y creará un elemento Product que tendrá el mismo ID que el que se ha enviado a la solicitud.
Observe que el nodo ProductID del destino no recibe los datos de la estructura Response, sino directamente del archivo CSV de origen. La razón es que queremos obtener una respuesta para cada ID de producto que pueda existir o no en el servidor.
Cuerpos
Los cuerpos se procesan de arriba abajo. Se procesa primero el primer cuerpo que coincida con la respuesta. A continuación, MapForce desciende por la jerarquía. Si ninguno de los cuerpos coincide, MapForce genera una excepción y se detiene la ejecución de la asignación.
Si existe en el servidor un producto con el ID suministrado desde el archivo CSV, el elemento Product se rellenará con los datos del cuerpo que tiene el código de estado 200. Si no hay ningún producto con ese ID en el servidor, se procesará el segundo cuerpo que tenga el código de estado 404 y el elemento Product obtendrá solo el ID del producto y un mensaje de error.
Resultado
A continuación se muestra el resultado que indica que se han recuperado correctamente los detalles de los productos con los ID 1, 5 y 7. El producto con el ID 6 no ha sido encontrado, por lo tanto, el cuerpo con el código de estado 404 se ha procesado y el valor del nodo Message se ha asignado al nodo ErrorMessage del destino.
<ProductList xsi:noNamespaceSchemaLocation="output.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Product ProductID="1" Description="This lightweight linen blouse blends sustainability with effortless style. Made from 100% organic linen, it offers a breathable, airy feel ideal for warm weather." CurrentStock="50"/> <Product ProductID="5" Description="These cargo pants bring a retro twist to modern utility wear. Constructed from a durable cotton canvas, they feature multiple oversized pockets for both functionality and style. Available in earthy tones like olive and sand, they blend seamlessly with both casual and adventurous looks." CurrentStock="0"/> <Product ProductID="6" ErrorMessage="Product not found"/> <Product ProductID="7" Description="Crafted for maximum comfort, this oversized knit cardigan wraps you in warmth without compromising on style. Available in soft, neutral shades like cream and heather gray, it's an ideal companion for effortless layering over everything from casual jeans to loungewear." CurrentStock="1"/> </ProductList> |