Avalados por :

Cómo enviar imágenes a un API de reconocimiento óptico de caracteres de SAP con éxito

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 27 Vistas
0
Cargando...

Hi Experts,

Tengo un caso de uso en el que estoy llamando a un punto de extremo de CPI, pasando la URL de una imagen jpeg alojada (como esta: http://braiden.net/images/img.jpg ) y luego hago una solicitud GET a esa URL usando una solicitud-respuesta para obtener los datos de imagen sin procesar en el cuerpo del mensaje.

He construido con éxito esta parte. Ahora que tengo estos datos de imagen sin procesar en el cuerpo del mensaje, me gustaría hacer una solicitud-respuesta al servicio de Reconocimiento Óptico de Caracteres de SAP ( documentado aquí ).

Esta API requiere que la solicitud esté formateada de esta manera:

•Content-Type: multipart/form-data; boundary=CPI

•APIKey: [alguna-clave-api-válida]

•Content-Length: [longitud-del-contenido]

  • Debe contener un cuerpo de formulario múltiple, con un solo campo llamado "files" que contenga los datos de la imagen

Debido a los requisitos de la solicitud para esta API, he agregado un modificador de contenido para eliminar todos los encabezados innecesarios (que pueden haber sido traídos de la primera solicitud) y agregar los encabezados requeridos. (Parece que el encabezado "Content-Length" se agrega automáticamente por CPI, y cualquier intento de cambiar/eliminar este encabezado no funciona).

Dentro de este modificador de contenido, también agregué lo siguiente en el cuerpo como una expresión:

--CPI
Content-Disposition: form-data; name="files"; filename="img.jpg"
Content-Type: image/jpeg

${body}
--CPI--

Esto envuelve los datos de imagen sin procesar con la información de límite necesaria requerida para el tipo de contenido multipart/form-data. (Este método de envolver datos sin procesar fue tomado prestado de esta publicación de blog .)

Aquí hay una imagen de mi flujo de integración:

Haz clic aquí para descargar este flujo de integración como un archivo zip.

Una cosa que he notado es que al enviar la solicitud desde Postman vs. hacer la solicitud desde CPI es que el valor del encabezado Content-Length es drásticamente diferente, y como ya mencioné, parece que no hay forma de establecer manualmente este encabezado en un valor diferente.

También he notado que al ver la solicitud HTTP sin procesar hecha por CPI, los datos de imagen son ligeramente diferentes de los datos de imagen al enviarlos usando un Cliente REST. Hay algunos caracteres faltantes de vez en cuando en la solicitud que hace CPI.

Aquí hay dos ejemplos de las solicitudes, una enviada desde un Cliente REST, la otra enviada desde CPI. La solicitud del Cliente REST funciona cuando se envía al API de OCR, pero la solicitud de CPI no (devuelve un error 500).

Solicitud del Cliente REST

Solicitud de CPI

Nuevamente, las diferencias son el valor del encabezado Content-Length y algunos caracteres faltantes de la solicitud de CPI.

Aquí hay algunas preguntas:

1. ¿Es el uso de una solicitud-respuesta para obtener los datos de imagen sin procesar la forma adecuada de almacenar la imagen en el cuerpo del mensaje, o hay un método mejor?

2. ¿Cómo puedo enviar correctamente esta imagen al API de OCR? Hasta ahora solo he estado recibiendo errores 500 del servidor del API de OCR.

3. ¿Debería estar usando un codificador MIME Multipart o un script para modificar la codificación? Si es así, ¿cómo?

TL;DR: Quiero enviar una imagen a un API de reconocimiento óptico de

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

¡Hola Eng Swee!

Gracias por tu continuo apoyo.

¡Tenías razón! ¡El Content-Modifier es definitivamente el culpable! Curiosamente, si aún incluyes el Content-Modifier en el iflow, pero dejas el cuerpo como simplemente:

${body}

los datos pasan perfectamente como si el Content-Modifier no estuviera allí. Esto es genial porque aún puedo usar un Content-Modifier para manipular los encabezados sin corromper los datos en el cuerpo. Pero cuando introduces algún otro texto, corrompe los datos de la imagen, por ejemplo:

${body}SomeText

(Verifiqué estos hallazgos usando el método de transferencia SFTP y usando HxD)

¿Sabes de alguna manera de recuperar el cuerpo en forma de matriz de bytes usando un script de groovy y modificarlo para agregar la información del cuerpo multipart evitando la conversión a una cadena?

Si crees que sería beneficioso, puedo publicar esto como una pregunta separada aquí ahora que hemos identificado el problema con la esperanza de que otros proporcionen su opinión (ya que esta pregunta probablemente ha perdido algo de tracción debido a su antigüedad).

Gracias,

Braiden

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola braidenspencer

Descargué tu IFlow y le eché un vistazo, y mi próxima "sospecha" sería en el Modificador de Contenido. Estás construyendo el cuerpo multipart ahí, pero mi preocupación es que la evaluación de la ${body} línea puede someterse a una codificación binaria a cadena que podría corromper el contenido potencialmente.

Voy a probar esto también en mi lado para ver cómo va.

Saludos

Eng Swee

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Eng Swee,

Gracias por tu respuesta rápida y detallada.

Sí, ¡es algo así como un escenario extraño! Para ser más específico, tengo un chatbot creado con SAP Conversational AI y quiero utilizar CPI para manejar la lógica backend del chatbot. Los usuarios pueden interactuar con el chatbot a través de canales móviles como Facebook Messenger. Cuando el usuario sube una foto, Facebook Messenger proporciona un enlace a la foto alojada en la red de distribución de contenido de Facebook. El chatbot luego reenvía esta URL a CPI.

De todos modos, he seguido tu sugerencia y enruté el mensaje a un servidor SFTP justo después del primer request-reply. Como resultado, recibí la imagen correctamente sin corrupción y pude verla. Descargué HxD, y ambos archivos parecen ser idénticos:

Debido a esto, el problema no parece estar en el primer request-reply.

Otra cosa que intenté fue codificar los datos de la imagen como una cadena base64 y llamar a decodeBase64 en ella para obtener los datos en bruto y almacenarlos en el cuerpo del mensaje usando un script groovy. Luego alimenté ese mensaje a través del resto del iflow, pero cuando llega el momento de hacer el request-reply a la API de OCR, la solicitud falla nuevamente con un error interno del servidor. ¿Tienes alguna otra sugerencia?

Gracias por tu apoyo.

Saludos,

Braiden Psiuk

from-cpi.png from-web.png
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Braiden

Tienes un escenario muy interesante 🙂

No tengo una respuesta directa, pero me gustaría ofrecer mi sugerencia basada en el análisis de lo que has proporcionado.

Comparé los archivos que proporcionaste y busqué las diferencias de caracteres en un editor hexadecimal (por ejemplo, HxD). La solicitud del cliente REST tiene caracteres adicionales EF BF BD que se consideran el Caracter de reemplazo Unicode (U+FFFD) . No estoy seguro por qué el cliente REST tiene esto mientras que CPI no.

Te recomendaría dividir el escenario (si aún no lo has hecho) para asegurarte de que la primera parte que recupera la imagen desde la URL funcione correctamente. Después de la solicitud-respuesta, intenta dirigirla a un servidor SFTP para guardar el archivo de imagen. Luego descarga el archivo desde SFTP e intenta ver el archivo para ver si hay alguna corrupción. Compáralo también con el archivo original (descargado a través del navegador) a nivel de bytes.

En cuanto a la longitud del contenido, no estoy seguro si hay una forma de anularlo. Intentaré investigar más sobre eso y te informaré si encuentro algo.

Saludos

Eng Swee

hex.png
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?