Pregunta
· 18 abr, 2023

"El secreto para convertir una lista en una cadena: ¿cuál es la manera idónea de transformar Lista a String?"

Buenos días;

Primeramente, expresar gracias reales sinceras y profundas por el tiempo que dedican ustedes a leer, entender y responder esta duda. Sobre todo muchas gracias por responderla de la mejor manera posible. Gracias.

Tenemos una duda:

El Sistema Origen nos informa en el body que envía hacia el método del Servicio REST " getCursosAdmitidosInscripcionAbierta" de la siguiente manera:

{
    "agrupacionPuesto": ["37","38"]
}

 

Siendo el Mensaje Request:

Class Mensajes.Request.miFormacion.GetCursosAdmitidosInscripcionAbiertaRequest Extends Ens.Request
{

Parameter RESPONSECLASSNAME = "Mensajes.Response.miFormacion.GetCursosAdmitidosInscripcionAbiertaResponse";

Property idUserLogueado As %String(MAXLEN = "");

Property agrupacionPuesto As list Of %String(MAXLEN = "");

En el visor vemos de manera correcta:

<?xml version="1.0" ?>
<!-- type: Mensajes.Request.miFormacion.GetCursosAdmitidosInscripcionAbiertaRequest  id: 14681697 -->
<GetCursosAdmitidosInscripcionAbiertaRequest>
	<idUserLogueado>43669691M</idUserLogueado>
	<agrupacionPuesto>
		<agrupacionPuestoItem>37</agrupacionPuestoItem>
		<agrupacionPuestoItem>38</agrupacionPuestoItem>
	</agrupacionPuesto>
</GetCursosAdmitidosInscripcionAbiertaRequest>

A continuación viene la duda.

En el método de la Operación REST, " GetCursosAdmitidosInscripcionAbierta"; ¿de qué manera enviamos en el Body del POST al Sistema Destino el contenido de la lista agrupacionPuesto así:

["37","38"]

 

De momento lo que hemos hecho es convertir a mano la pRequest.agrupacionPuesto ; que es una : %Collection.ListOfDT a ["37","38"]
 

Siendo el código del método:

Method GetCursosAdmitidosInscripcionAbierta(pRequest As Mensajes.Request.miFormacion.GetCursosAdmitidosInscripcionAbiertaRequest, pResponse As Mensajes.Response.miFormacion.GetCursosAdmitidosInscripcionAbiertaResponse) As %Library.Status
{
	//Creamos Request y Response HTTP
	Set httpRequest=##class(%Net.HttpRequest).%New()
	set tResponse  = ##class(%Net.HttpResponse).%New()

	set URL		= ..Adapter.URL_"formacion/getcursosopen"
	$$$LOGINFO("URL: "_URL)
	
	set httpRequest.ContentType = "application/json"

	do httpRequest.SetHeader("idUserLogueado",pRequest.idUserLogueado)	
	set idUserLogueado =httpRequest.GetHeader("idUserLogueado")
	$$$LOGINFO("Enviamos en la cabecera, idUserLogueado: "_idUserLogueado)
	
	// Escribimos mensaje en body
	$$$LOGALERT("pRequest.agrupacionPuesto: "_pRequest.agrupacionPuesto)
	set stringAgrupacionPuesto = "["
	For i=1:1:pRequest.agrupacionPuesto.Count() {
    	Set stringAgrupacionPuesto = stringAgrupacionPuesto_""""_pRequest.agrupacionPuesto.GetAt(i)_""","
	}
	//elimina la última coma
	Set stringAgrupacionPuesto=$extract(stringAgrupacionPuesto, 1, $length(stringAgrupacionPuesto)-1)
	set stringAgrupacionPuesto = stringAgrupacionPuesto_"]"

    do httpRequest.EntityBody.Write(stringAgrupacionPuesto)
    $$$LOGASSERT("stringAgrupacionPuesto: "_stringAgrupacionPuesto)
    
	//Enviamos al sistema externo
	set tSC=httpRequest.Post(URL,0) 
	$$$LOGALERT("tSC: "_$System.Status.GetErrorText(tSC))

	//Lanzamos excepcion si hubo error
	if $$$ISERR(tSC){
			$$$ThrowOnError(tSC)
	}
	
	set tResponse = httpRequest.HttpResponse
	
	set linea = ""
	//Leemos respuesta
	if (tResponse.Data.AtEnd = 0) {
		set linea = linea_tResponse.Data.Read()
	}
	$$$LOGINFO("linea: "_linea)
	
	// se transforma el objeto JSON a un objeto local
	set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()
	set tSC= claseAux.%ConvertJSONToObject(.linea,"Mensajes.Response.miFormacion.GetCursosAdmitidosInscripcionAbiertaResponse",.pResponse,1)	

	Quit $$$OK
}

Donde el fragmento que nos incumbe es:

// Escribimos mensaje en body

set stringAgrupacionPuesto = "["
For i=1:1:pRequest.agrupacionPuesto.Count() {
     Set stringAgrupacionPuesto = stringAgrupacionPuesto_""""_pRequest.agrupacionPuesto.GetAt(i)_""","
}
//elimina la última coma
Set stringAgrupacionPuesto=$extract(stringAgrupacionPuesto, 1, $length(stringAgrupacionPuesto)-1)
set stringAgrupacionPuesto = stringAgrupacionPuesto_"]"     do httpRequest.EntityBody.Write(stringAgrupacionPuesto)
    $$$LOGASSERT("stringAgrupacionPuesto: "_stringAgrupacionPuesto)
    ;$$$LOGINFO("Rellenamos body con linea: "_linea)
    
//Enviamos al sistema externo
set tSC=httpRequest.Post(URL,0)
 

 

¿Existe algún método interno que ya convierta %Collection.ListOfDT a String?

Muchas gracias por leernos y respondernos. Gracias.

🙏 Gracias por su tiempo, su paciencia y su disposición para hacer de este un espacio en línea enriquecedor y positivo. Resolviendo las dudas, explicando las causas y mencionando documentación, ejemplos y/o el paso a paso concreto.

Un saludo.
 

Product version: IRIS 2020.1
$ZV: IRIS for UNIX (Red Hat Enterprise Linux for x86-64) 2020.1.1 (Build 408U) Sun Mar 21 2021 22:21:14 EDT
Comentarios (1)1
Inicie sesión o regístrese para continuar

Buenas Yone. Al ser tu collection una propiedad de otro elemento podrías usar el método Serialize para obtener el %String, luego sólo tendrías que añadir los corchetes al inicio y al final. Puedes ver la documentación al respecto en la siguiente URL: 

https://docs.intersystems.com/iris20201/csp/documatic/%25CSP.Documatic.c...