"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í:
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 HTTPSet 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 comaSet stringAgrupacionPuesto=$extract(stringAgrupacionPuesto, 1, $length(stringAgrupacionPuesto)-1)
set stringAgrupacionPuesto = stringAgrupacionPuesto_"]"do httpRequest.EntityBody.Write(stringAgrupacionPuesto)
$$$LOGASSERT("stringAgrupacionPuesto: "_stringAgrupacionPuesto)
//Enviamos al sistema externoset tSC=httpRequest.Post(URL,0)
$$$LOGALERT("tSC: "_$System.Status.GetErrorText(tSC))
//Lanzamos excepcion si hubo errorif$$$ISERR(tSC){
$$$ThrowOnError(tSC)
}
set tResponse = httpRequest.HttpResponse
set linea = ""//Leemos respuestaif (tResponse.Data.AtEnd = 0) {
set linea = linea_tResponse.Data.Read()
}
$$$LOGINFO("linea: "_linea)
// se transforma el objeto JSON a un objeto localset 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.
Comments
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…