
Recientemente, estaba trabajando en un proyecto que requiere que consuma la API de SAP Build Process Automation en mi aplicación. Entonces, cuando estaba mirando nuestro centro de API de SAP, descubrí que las API para SAP Build están bastante bien documentadas: la siguiente parte es consumir la API. Pero en el mundo de JavaScript y la nube, hay muchas formas de consumir una API. Uno de los enfoques populares es usar Axios, pero es posible que termine haciendo muchas cosas manuales para conectarse a la API, especialmente cuando desea usar Propagación principal y conectarse a CF.
Fue entonces cuando descubrí el SDK de la nube de SAP, lo que ayuda a resolver esto al proporcionar API tipificadas para una API abierta o un servicio OData. También ofrece múltiples formas de conectarse a las API en su subcuenta BTP de SAP, mediante el enlace de servicios, el destino y diferentes mecanismos de autenticación, incluido el intercambio de tokens de usuario de OAuth (propagación principal).
En esta publicación de blog, mostraré cómo puede conectarse a la API de SAP Build Process Automation mediante Credenciales de cliente y Propagación principal. Para esto, crearé una aplicación CAP simple basada en Mecanografiado utilizando VSC Code. Puede hacer lo mismo en una aplicación Node JS o consumir otras API de SAP BTP.
Aplicación de extensión que se conecta a SAP Build Process Automation mediante SAP Cloud SDK (User Token Exchange)
Guión: [Consuming SAP Build Process Automation: Processes & Workflows] Para obtener todas las tareas creadas para un flujo de trabajo en estado listo.
Pasos:
Suponiendo que ya se creó una nueva aplicación CAP utilizando la plantilla, importe la API en formato JSON en la carpeta principal de recursos como se muestra en este repositorio de Github.
Inicializando el proyecto:
Asegúrese de que ts-node esté instalado globalmente:
npm i -g typescript ts-node
Como este es un formato de API abierta, primero instale el generador de API abierta usando el siguiente comando:
npm install @sap-cloud-sdk/openapi-generator
Ahora genere el cliente escrito usando el siguiente comando:
npx openapi-generator --input resources --outputDir srv/generated --skipValidation
[Optional] También quiero generar el archivo cds para esta API, de modo que pueda usarlo como un tipo de retorno para la importación de mi función.
cds import './resources/SPA_Workflow_Runtime New.json' --from openapi --as cds
Agrega un servicio.cds presentar en Srv carpeta y agregue el siguiente código:
// Below code is from CDS Import from earlier step
using { Processes._.Workflows_types.TaskInstance as TaskInsance } from './external/SPA_Workflow_Runtime New.cds';
// New service to expose a function import
service sapCloudSDKBuildTS {
function getTaskInstances() returns array of TaskInsance;
}
Dos cosas que hice en el código anterior:
Consumir la API usando SAP Cloud SDK:
Hay muchas formas de consumir una API BTP de SAP utilizando SAP Cloud SDK. En este ejemplo, usaré el enfoque basado en la vinculación de servicios, que solo necesita una instancia de servicio creada para el servicio SAP Build Process Automation. Para probar localmente, vincule la instancia de servicio a la aplicación usando el siguiente comando:
cds bind process-automation --to spateamsint-spa:spateamsint-spa-key --kind process-automation
Aquí spateamsint-spa es el nombre de la instancia de servicio y spateamsint-spa-clave es el nombre de la clave.
En el código, primero tenemos que importar la API de TaskInstances usando el siguiente código:
import { UserTaskInstancesApi } from "./generated/SPA_Workflow_Runtime New";
Agrega un servicio.ts presentar en Srv carpeta para escribir el código devuelve las instancias de tareas, cuando se llama a la función: getTaskInstances(). Comprobar el código para hacer algo de copy-pasta (lo explicaré en los próximos pasos).
Como es un cliente escrito, puede explorar todos los métodos disponibles, pero usamos getV1TaskInstances para obtener todas las instancias de tareas disponibles.
const responseData = await UserTaskInstancesApi.getV1TaskInstances({
definitionId:
"form_simpleapprovalp_1@****.testworkflow.simpleapproval",
status: "READY",
}).execute({
destinationName: "process-automation",
serviceBindingTransformFn,
});
También puede observar que he pasado parámetros adicionales como Estadoque forman parte de las tipificaciones.
En el nombre del destinodebe pasar el nombre del servicio, que en nuestro caso es automatización de procesos.
Nota: este es el nombre del servicio, no el nombre de la instancia del servicio. SAP Cloud SDK obtendrá las instancias de servicio asociadas con el servicio automatización de procesos de SERVICIOS_VCAP que se cargan localmente cuando enlazamos nuestra aplicación usando ENLACE DE CDS para nuestras pruebas locales. También puede hacer esto utilizando un destino SAP BTP real, que mostraré en el otro ejemplo después de este.
También hay otra función que se pasa: serviceBindingTransformFn. Este se debe a que solo algunos servicios son compatibles de forma predeterminada con SAP Cloud SDK para obtener la URL, las credenciales, etc., de la instancia del servicio automáticamente, y automatización de procesos el servicio no es uno de ellos 😉
Por esta razón, estamos pasando esta función, que tiene el siguiente código:
Como puedes ver estoy usando ejecutarHttpRequest, parte de SAP Cloud SDK para obtener el token. Pero también puedes usar Axios para hacer ese código un poco más corto 😉 También puedes encontrar el ejemplo de Axios comentado en el repositorio de github.
Al final, formará un objeto con los detalles requeridos y lo devolverá, que será consumido por SAP Cloud SDK y devolverá nuestros datos solicitados. Ejecute la aplicación usando el siguiente comando:
cds-ts watch --profile hybrid
Una vez que llame a la URL, le devolverá todas las tareas para el flujo de trabajo especificado.
por ejemplo: http://localhost:4004/sap-cloud-sdkbuild-ts/getTaskInstances()
Nota: Solo cubro la instalación y las pruebas locales. Debe tener mta.yaml con los recursos y módulos necesarios para que se ejecute en el entorno SAP BTP CF y también debe ajustar el paquete.json para actualizar la tarea de inicio. Comprobar el Ayuda CAP para TypeScript para más información.
Guión: [Consuming SAP Build Process Automation: Inbox] Para obtener todas las tareas de flujo de trabajo asignadas al usuario que inició sesión. [Testing done Locally]
Pasos:
Suponiendo que ya se creó una nueva aplicación CAP utilizando la plantilla, importe la API en formato EDMX en la carpeta principal de recursos como se muestra en este repositorio de Github.
Inicializando el proyecto:
Asegúrese de que ts-node esté instalado globalmente:
npm i -g typescript ts-node
Como se trata de una API de OData, instale el generador regular con el siguiente comando:
npm install @sap-cloud-sdk/generator
[Optional] Agregue un archivo serviceMapping.json con el siguiente contenido, para que pueda omitir agregar la ruta mientras ejecuta las solicitudes:
{
"SPA_Workflow_Inbox": {
"directoryName": "com-sap-bpm-wfs-tcm-metadata-service",
"servicePath": "/public/workflow/odata/v1/tcm",
"npmPackageName": "com-sap-bpm-wfs-tcm-metadata-service"
}
}
Ahora genere el cliente escrito usando el siguiente comando. En caso de que obtenga algún error relacionado con las tipificaciones de «triple haz», instálelo. npm install –save @types/triple-beam
npx generate-odata-client --inputDir resources --outputDir srv/generated --overwrite -s "resources/serviceMapping.json"
Agrega un servicio.cds presentar en Srv carpeta y agregue el siguiente código. Se explica por sí mismo, y tendrá una idea del ejemplo anterior.
service sapCloudSDKBuildTS @(requires: 'authenticated-user') {
// define type {};
type TaskCollection {
instanceId: String;
status:String;
}
function getTaskInstances() returns array of TaskCollection;
}
Consumo de la API de OData con SAP Cloud SDK:
En este escenario, mostraré cómo consumir lo mismo usando el Destino creado en SAP BTP. Por lo tanto, debe vincular la instancia de destino para probarla localmente.
cds bind destination --to destination-srv-instance:destination-srv-instance-key --kind destination
SAP Cloud SDK también requiere una instancia XSUAA para obtener el destino. Así que vincúlelo como se muestra a continuación: (Puede hacerlo en los pasos posteriores, en las pruebas híbridas XSUAA)
cds bind xsuaa --to xsuaa-srvins:xsuaa-srvins-key --kind xsuaa
Agrega un servicio.ts presentar en Srv carpeta para escribir el código devuelve las Instancias de tareas para el usuario que ha iniciado sesión, cuando se llama a la función: getTaskInstances(). Comprobar el código para hacer algo de copy-pasta.
const { taskApi } = wfApi();
const jwt = retrieveJwt((Request as any).req);
const result = await taskApi
.requestBuilder()
.getAll()
.top(5)
.execute({ destinationName: "sap_process_automation_service_user_token", jwt:jwt });
El código es bastante sencillo y está escrito, por lo que será fácil descubrir todos los métodos disponibles. Lo único único aquí es obtener el token jwt, que nuevamente lo proporciona SAP Cloud SDK. Esto estará disponible una vez que el usuario esté autenticado.
En el nombre del destino, debes pasar el destino que creaste en tu subcuenta. p.ej:
Pero, ¿cómo autenticar al usuario para las pruebas locales? – Usaremos un aprobador para autenticar al usuario y reenviar el token a la llamada de servicio. Documentación SAP CAP para pruebas híbridas XSUAA, que ha explicado esto claramente
Siga la documentación anterior y agregue las bibliotecas de nodos faltantes (pasaporte y xssec). Ejecute el enrutador de la aplicación y ejecute la aplicación con el script en el paquete principal.json.
Con esto, podrá obtener todas las tareas de flujo de trabajo que se le asignaron y SAP Cloud SDK realizará el intercambio de token de usuario por nosotros. No estoy mostrando cómo puede implementar esto, ya que es bastante más fácil con muchas publicaciones de blog y tutoriales que hablan sobre la implementación de una aplicación CAP en el entorno SAP BTP CF.
En caso de que quiera hacerlo manualmente usando Postman, descargue la colección de este repositorio de github e impórtalo en tu cartero. Luego complete las variables de colección, obtenga el token XSUAA, realice el intercambio de token de usuario y use el token para obtener las tareas asignadas (TaskCollection).
Gracias amigos, háganme saber sus pensamientos y si conocen algún enfoque mejor o alternativo para hacer esto, por favor compartan aquí 🙂
¡Salud!
Mahesh
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073