• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
  • Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
Twitter Linkedin Instagram

S4PCADEMY_Logo
  • Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
Twitter Linkedin Instagram
Content-Type: multipart/form-data  ·  dynamicconfiguration  ·  java mapping  ·  Mapping Parameter  ·  open text  ·  rest adapter  ·  Technical Articles  ·  variable substitution

Creación de una integración de sincronización para descargar contenido de texto abierto con API REST de Sap PO, uso de API con autenticación de datos de formulario/multiparte

By s4pcademy 


Introducción:

El propósito de este documento es desarrollar una interfaz síncrona para descargar contenido de Open Text Content Server (OTCS) utilizando la API REST. He tratado de cubrir el diseño general con fragmentos de código como referencia.

Alcance:

  • Descanse la autenticación OTCS utilizando Content-Type: multipart/form-data (Credenciales como encabezado del cuerpo multiparte) para la generación del token (otcticket).
  • Mapeo parametrizado para acceder a las credenciales OTCS desde ICO.
  • Llamar a la búsqueda de autenticación de OTCS, acceder a los parámetros desde el mapeo de Java.
  • Creando DynamicConfigurationKey para el parámetro de canal de descanso del mapeo de Java.
  • La administración de tokens de sesión de OTCS está fuera del alcance.

Diseño general:

Síncrono%20Interfaz%20para%20obtener%20documento%20de%20OpenText%20a través de%20PO%207.5

Interfaz de sincronización para obtener el documento de OpenText a través de PO 7.5

Flujo de solución:

  1. SAP ECC llama a un proxy para enviar el ID de documento del documento en OTCS.
  2. El mapeo Java de solicitud de orden de compra recibe el ID del documento.
    1. Llamadas OTCS – Autenticación API para un token (otcsticket) a través de búsqueda REST
    2. Publicar ID y token en OTCS – Contenido API
  3. PO Response Java Mapping recibe Documento como un flujo de entrada y lo asigna al campo de contenido.
  4. El campo de contenido Base64 se envía a SAP para su posterior procesamiento.

API de descanso consumida desde Open Text Content Server (OTCS):

  • API de autenticación: /otcs/cs.exe/api/v1/auth: La API debe llamarse con credenciales en Content-Type: sección multipart/form-data para generar un token, que se llama otcsticket. Otcticket debe estar presente en el encabezado de contenido API a llamar.En%20Content-Type%3A%20multipart/form-data%2C%20credentials%20need%20to%20be%20present%20separated%20by%20boundaryEn Content-Type: multipart/form-data, las credenciales deben estar presentes, separadas por un límite.
  • API de contenido: /otcs/cs.exe/api/v1/nodes/{ID}/content: La API devolvería el documento como un flujo de bytes, cuando se le llame con el token y el ID del documento en el encabezado.
    Token%20y%20ID%20de%20documento%20en%20el%20encabezadootcsticket e ID del documento en el encabezado http

Objetos PO y fragmentos de código:

Estructura de datos

El ID de documento para OTCS viene como DataID de SAP. El documento se devuelve a SAP como Contenido.Proxy%20Estructura

OICICO%20con%20Asignación%20Parámetros%20definidos

Mapeo (MM) y mapeo operativo (OM)

Tenga cuidado con el parámetro ICO anterior en

  • Sección OM-> Parámetros y sección Enlace de asignación de solicitud
  • MM -> pestaña Firma

Solicitud de mapeo con mapeo java en la sección de atributos y métodos

public void transform(TransformationInput in, TransformationOutput out) throws StreamTransformationException {

		try {

			getTrace().addDebugMessage("***OTCS-Request-JavaMapping-Start");
			
			//Get the mapping parameter from ICO
			String paramChannel = in.getInputParameters().getString("lookupChannel"); 
			String paramUserName = in.getInputParameters().getString("username"); 
			String paramPassword = in.getInputParameters().getString("password");
			String paramBoundary = in.getInputParameters().getString("boundary");
			getTrace().addDebugMessage("***OTCS-Step1-LogPramFromICO-lookupChannel:" + paramChannel + "-username:" 
				+ paramUserName + "-password:" + paramPassword +"-boundary:" +  paramBoundary);
			
			//Creating multipart/form-data for OTCS authentication
			String LINE_FEED = "\r\n";
			String ContentDisposition = "Content-Disposition: form-data; name=\"";
			String authReqFormData ="";
			authReqFormData =  LINE_FEED + paramBoundary + LINE_FEED + ContentDisposition + "username\"" + LINE_FEED 
				+ LINE_FEED + paramUserName + LINE_FEED + paramBoundary +  LINE_FEED +ContentDisposition 
				+ "password\"" + LINE_FEED + LINE_FEED + paramPassword + LINE_FEED + paramBoundary + "–-" + LINE_FEED;
			getTrace().addDebugMessage("***OTCS-Step2-multipart/form-data:" + authReqFormData);
			
			//Read message header value for Receiver 
			String paramReceiver = in.getInputHeader().getReceiverService();
			getTrace().addDebugMessage("***OTCS-Step3-ReceiverService:" + paramReceiver);
			
			//Get the OTCS rest lookup Channel Object for authentication
			Channel lookup_channel = LookupService.getChannel(paramReceiver, paramChannel);
			
			//Call rest lookup channel, with multipart/form-data payload
			SystemAccessor accessor = null;
			accessor = LookupService.getSystemAccessor(lookup_channel);
			InputStream authInputStream = new ByteArrayInputStream(authReqFormData.getBytes("UTF-8"));
			Payload authPayload = LookupService.getXmlPayload(authInputStream);
			Payload tokenOutPayload = null;
			//Call lookup
			getTrace().addDebugMessage("***OTCS-Step4-CallLookupChannel");
			tokenOutPayload = accessor.call(authPayload);
			//Parse for Lookup response for token
			InputStream authOutputStream = tokenOutPayload.getContent();
			DocumentBuilderFactory authfactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder authbuilder = authfactory.newDocumentBuilder();
			Document authdocument = authbuilder.parse(authOutputStream);
			NodeList nlticket = authdocument.getElementsByTagName("ticket");
			String tokenTicket = "Empty";
			Node node = nlticket.item(0);
			if (node != null){
				node = node.getFirstChild();
				if (node != null){
					tokenTicket = node.getNodeValue();
				}
			}
			getTrace().addDebugMessage("***OTCS-Step5-TokenFromLookup:" + tokenTicket);
						
			//Parse input stream and get DataID from SAP
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(in.getInputPayload().getInputStream());
			String DataID = doc.getElementsByTagName("DataID").item(0).getTextContent();
			getTrace().addDebugMessage("***OTCS-Step6-DataIDFromSAP: " + DataID);
			
			//Create HTTP Header for rest call via setting DynamicConfiguration keys, that can be used in reciver channel
			DynamicConfiguration conf = in.getDynamicConfiguration();
			DynamicConfigurationKey keytokenTicket = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST","HeadertokenTicket");
			DynamicConfigurationKey keyDataID = DynamicConfigurationKey.create("http://sap.com/xi/XI/System/REST","HeaderDataID");
			conf.put(keytokenTicket, tokenTicket);
			conf.put(keyDataID, DataID);

			String DummyPayload =  "DummyPayload";
			// Instantiating output stream to write at Target message
			OutputStream os = out.getOutputPayload().getOutputStream();
			// writing idoc to output stream
			os.write(DummyPayload.getBytes("UTF-8"));
			os.flush();
			os.close();
			getTrace().addDebugMessage("***OTCS-Request-JavaMapping-End");
		}
		catch (Exception e){
			getTrace().addDebugMessage(e.getMessage().toString());
			throw new StreamTransformationException(e.getMessage());
		}

	}

Mapeo de respuestas con mapeo de java en la sección de atributos y métodos

public void transform(TransformationInput in, TransformationOutput out) throws StreamTransformationException {
		try 
		{
			getTrace().addDebugMessage("***OTCS-Respose-JavaMapping-Start");
			InputStream inputstream = in.getInputPayload().getInputStream();
			OutputStream outputstream = out.getOutputPayload().getOutputStream();
			//Copy Input Payload into Output xml
			byte[] b = new byte[inputstream.available()];
			inputstream.read(b);
			//Form Output xml
			String outputStart = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ns0:MT_DocContent_Res xmlns:ns0=\"urn://XXXXXXXXXXX.com/OTCS/DocDownload\"><Content>";
			String outputEnd = "</Content></ns0:MT_DocContent_Res>";
			outputstream.write(outputStart.getBytes("UTF-8"));
			outputstream.write(b);
			outputstream.write(outputEnd.getBytes("UTF-8"));
			outputstream.flush();
			outputstream.close();
			getTrace().addDebugMessage("***OTCS-Respose-JavaMapping-End");
		}

		catch (Exception e)
		{
			getTrace().addDebugMessage(e.getMessage().toString());
			throw new StreamTransformationException(e.getMessage());

		}
	}

Canales

Tenemos tres canales en el flujo, como el canal Proxy de SAP, los canales Rest para la búsqueda de tokens y la obtención de documentos del OTCS.

Proxy – CC_OTCS_GetDoc_Proxy_Sender

Canal de búsqueda de descanso: CC_OTCS_Rest_LookUp

  • URL: http://{Servidor}/otcs/cs.exe/api/v1/auth
  • Operación de reposo- POST
  • Formato de datos: UTF-8
  • Encabezados HTTP, como se muestra a continuación

Tipo de contenido multipart/form-data; límite=SapPO75FormBoundaryhahahahahahaha FIN

Resto del canal de obtención de documentos: CC_OTCS_Rest_Receiver

  • URL: http:// /{Servidor}/otcs/cs.exe/api/v1/nodos/{IDENTIFICACIÓN}/contenido
  • Sustitución de variables-
  • Operación Resto- GET
  • Formato de datos: UTF-8
  • Encabezados HTTP, como se muestra a continuación

otcsticket {otcsticket}

IDENTIFICACIÓN {IDENTIFICACIÓN}

Referencia:



Source link


abiertoAPIautenticaciónconcontenidoCreacióndatosdescargarformulariomultiparteintegraciónparaRESTSAPSincronizacióntextounauso

Artículos relacionados


Product Information
Novedades de SAP Mobile Start Versión 1.6
#DMC  ·  DMC  ·  Personal Insights  ·  SAP Digital Manufacturing Cloud  ·  SAP Digital Manufacturing Cloud for execution  ·  SAP DMC  ·  SAP DMCe
Cómo manejar la orden de producción de reparación en SAP Digital Manufacturing Cloud (DMC)
abap cds annotations  ·  feature showcase app  ·  odata v4  ·  rap  ·  Technical Articles  ·  UI Annotations
El escaparate de funciones de SAP Fiori Elements con anotaciones RAP y ABAP CDS

Deja tu comentario Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

Mejorar Regex Toy - Parte 3
Previo
Asistencia al usuario: ¿qué es realmente y cómo puede contribuir?
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.
Cookies Para que este sitio funcione adecuadamente, a veces instalamos en los dispositivos de los usuarios pequeños ficheros de datos, conocidos como cookies. La mayoría de los grandes sitios web también lo hacen.
Aceptar
Cambiar ajustes
Configuración de Cookie Box
Configuración de Cookie Box

Ajustes de privacidad

Decida qué cookies quiere permitir. Puede cambiar estos ajustes en cualquier momento. Sin embargo, esto puede hacer que algunas funciones dejen de estar disponibles. Para obtener información sobre eliminar las cookies, por favor consulte la función de ayuda de su navegador. Aprenda más sobre las cookies que usamos.

Con el deslizador, puede habilitar o deshabilitar los diferentes tipos de cookies:

  • Bloquear todas
  • Essentials
  • Funcionalidad
  • Análisis
  • Publicidad

Este sitio web hará:

Este sitio web no:

  • Esencial: recuerde su configuración de permiso de cookie
  • Esencial: Permitir cookies de sesión
  • Esencial: Reúna la información que ingresa en un formulario de contacto, boletín informativo y otros formularios en todas las páginas
  • Esencial: haga un seguimiento de lo que ingresa en un carrito de compras
  • Esencial: autentica que has iniciado sesión en tu cuenta de usuario
  • Esencial: recuerda la versión de idioma que seleccionaste
  • Functionality: Remember social media settings
  • Functionality: Remember selected region and country
  • Analytics: Keep track of your visited pages and interaction taken
  • Analytics: Keep track about your location and region based on your IP number
  • Analytics: Keep track of the time spent on each page
  • Analytics: Increase the data quality of the statistics functions
  • Advertising: Tailor information and advertising to your interests based on e.g. the content you have visited before. (Currently we do not use targeting or targeting cookies.
  • Advertising: Gather personally identifiable information such as name and location
  • Recuerde sus detalles de inicio de sesión
  • Esencial: recuerde su configuración de permiso de cookie
  • Esencial: Permitir cookies de sesión
  • Esencial: Reúna la información que ingresa en un formulario de contacto, boletín informativo y otros formularios en todas las páginas
  • Esencial: haga un seguimiento de lo que ingresa en un carrito de compras
  • Esencial: autentica que has iniciado sesión en tu cuenta de usuario
  • Esencial: recuerda la versión de idioma que seleccionaste
  • Functionality: Remember social media settings
  • Functionality: Remember selected region and country
  • Analytics: Keep track of your visited pages and interaction taken
  • Analytics: Keep track about your location and region based on your IP number
  • Analytics: Keep track of the time spent on each page
  • Analytics: Increase the data quality of the statistics functions
  • Advertising: Tailor information and advertising to your interests based on e.g. the content you have visited before. (Currently we do not use targeting or targeting cookies.
  • Advertising: Gather personally identifiable information such as name and location
Guardar y cerrar