Page 1 of 1

URLEncoder

Posted: Fri Jan 30, 2026 2:51 pm
by mterraz

Estimados Colegas,
En esta oportunidad estoy trabajando con un Webservice al cual debo cambiarle el formato al mensaje XML en la URL y quisiera consultar si existe algun metodo del estilo URLEncoder.encode() que funcione o hayan utilizado.

Actualmente el parámetro mensaje se está enviando con el XML “crudo”, es decir, sin aplicar URL-encoding completo. Al contener caracteres como <, >, comillas, espacios y saltos de línea, el servidor (Tomcat/Apache) rechaza el request antes de que el WebService pueda procesar el contenido, generando el error HTTP 400.

cUrl:='https://tx.itcsoluciones.ar/rest/v1/txs ... aje='+cXml

Para que la llamada funcione correctamente, es necesario que:

El XML ADESFA completo sea URL-encodeado (percent-encoding RFC 3986) antes de concatenarlo al parámetro mensaje.
Ejemplos:
< → %3C

→ %3E
" → %22
espacios → %20

No se utilicen entidades HTML como &quot;, &#47;, etc., ya que esas no corresponden a URL-encoding y provocan que el querystring se interprete incorrectamente.

Alguien ha utilizado es tipo de formato o conoce alguna forma de convertir un Xml a URL conding?

EL MENSAJE UTILIZADO ES DE ESTE TIPO:

<MensajeADESFA version = "2.0" >
<EncabezadoMensaje>
<NroReferencia></NroReferencia>
<TipoMsj>200</TipoMsj>
<CodAccion>290020</CodAccion>
<IdMsj>447</IdMsj>
<InicioTrx>
<Fecha>20260130</Fecha>
<Hora>101532</Hora>
</InicioTrx>
<Terminal>
<Tipo>PC</Tipo>
<Numero>1004</Numero>
</Terminal>
<Software>
<Nombre>xxx</Nombre>
<Version>1.1.01</Version>
</Software>
<Prestador>
<Cuit></Cuit>
<Sucursal>1</Sucursal>
<RazonSocial></RazonSocial>
</Prestador>
</EncabezadoMensaje>
<EncabezadoReceta>
<Prescriptor>
<Apellido></Apellido>
<Nombre></Nombre>
<TipoMatricula>P</TipoMatricula>
<Provincia>RIO NEGRO</Provincia>
<NroMatricula>456456</NroMatricula>
<TipoPrescriptor>M</TipoPrescriptor>
<Cuit></Cuit>
</Prescriptor>
<Beneficiario></Beneficiario>
<Financiador></Financiador>
<Credencial>
<Numero>456456</Numero>
<Track>456456</Track>
<cvc2>345</cvc2>
<ModoIngreso>A</ModoIngreso>
</Credencial>
<FechaReceta>20260130</FechaReceta>
<Dispensa>
<Fecha>20260130</Fecha>
<Hora>101532</Hora>
</Dispensa>
<Formulario>
<Fecha>20260130</Fecha>
<Numero>456456</Numero>
</Formulario>
</EncabezadoReceta>
<DetalleReceta>
<Item>
<NroItem>1</NroItem>
<CodBarras>7795345122489</CodBarras>
<CodTroquel>9961726</CodTroquel>
<Alfabeta>61726</Alfabeta>
<CantidadSolicitada>1</CantidadSolicitada>
<Generico>M</Generico>
</Item>
</DetalleReceta>
</MensajeADESFA>

Muchas gracias por sus comentarios.
Saludos Mariano


Re: URLEncoder

Posted: Fri Jan 30, 2026 3:16 pm
by JoséQuintas

No se hace esto ya automaticamente ?


Re: URLEncoder

Posted: Fri Jan 30, 2026 3:24 pm
by mterraz

Hola Jose,
Como estas?, hasta ahora envio el mensaje de esta forma:

cUrl:='https://tx.itcsoluciones.ar/est/v1/txs/ ... aje='+cXml

donde cXml es:

<MensajeADESFA version = "2.0" >
<EncabezadoMensaje>
<NroReferencia></NroReferencia>
<TipoMsj>200</TipoMsj>
<CodAccion>290020</CodAccion>
<IdMsj>447</IdMsj>
<InicioTrx>
<Fecha>20260130</Fecha>
<Hora>101532</Hora>
</InicioTrx>
<Terminal>
<Tipo>PC</Tipo>
<Numero>1004</Numero>
</Terminal>
<Software>
<Nombre>xxx</Nombre>
<Version>1.1.01</Version>
</Software>
<Prestador>
<Cuit></Cuit>
<Sucursal>1</Sucursal>
<RazonSocial></RazonSocial>
</Prestador>
</EncabezadoMensaje>
<EncabezadoReceta>
<Prescriptor>
<Apellido></Apellido>
<Nombre></Nombre>
<TipoMatricula>P</TipoMatricula>
<Provincia>RIO NEGRO</Provincia>
<NroMatricula>456456</NroMatricula>
<TipoPrescriptor>M</TipoPrescriptor>
<Cuit></Cuit>
</Prescriptor>
<Beneficiario></Beneficiario>
<Financiador></Financiador>
<Credencial>
<Numero>456456</Numero>
<Track>456456</Track>
<cvc2>345</cvc2>
<ModoIngreso>A</ModoIngreso>
</Credencial>
<FechaReceta>20260130</FechaReceta>
<Dispensa>
<Fecha>20260130</Fecha>
<Hora>101532</Hora>
</Dispensa>
<Formulario>
<Fecha>20260130</Fecha>
<Numero>456456</Numero>
</Formulario>
</EncabezadoReceta>
<DetalleReceta>
<Item>
<NroItem>1</NroItem>
<CodBarras>7795345122489</CodBarras>
<CodTroquel>9961726</CodTroquel>
<Alfabeta>61726</Alfabeta>
<CantidadSolicitada>1</CantidadSolicitada>
<Generico>M</Generico>
</Item>
</DetalleReceta>
</MensajeADESFA>

y obtengo el error del formato por no ser el parametro "mensaje" URLEncoded, por lo que entieno deberia reemplazar en cXML todos los caracteres que no son RFC 7230 / RFC 3986.
Ejemplos:
< → %3C

→ %3E
" → %22
espacios → %20

“Invalid character found in the request target – RFC 7230 / RFC 3986”

Estoy pensando en implementar una function de este tipo:

Code: Select all | Expand

//...................................
FUNCTION ENCODEURL(cPassword)
   LOCAL cResult := ""
   LOCAL nLen := Len(cPassword)
   LOCAL cChar
   LOCAL i

   FOR i := 1 TO nLen
      cChar := SubStr(cPassword, i, 1)
      DO CASE
         CASE cChar == "<"
            cResult += "%3C"
         CASE cChar == ">"
            cResult += "%3E"
         CASE cChar == '"'
            cResult += "%22"
		 CASE cChar == " "
            cResult += "%20"	
         OTHERWISE
            cResult += cChar
      ENDCASE
   NEXT

RETURN cResult

Gracias Mariano.


Re: URLEncoder

Posted: Fri Jan 30, 2026 5:35 pm
by wilsongamboa

buenas tardes
talvez esta funcion es lo que busca

Code: Select all | Expand

FUNCTION URLEncode( cTexto )
    LOCAL cResultado := ""
    LOCAL nI, cChar, nCode

FOR nI := 1 TO Len( cTexto )
    cChar := SubStr( cTexto, nI, 1 )
    nCode := Asc( cChar )

    // Alfanuméricos y caracteres seguros no se codifican
    IF ( nCode >= 48 .AND. nCode <= 57 ) .OR. ; // 0-9
       ( nCode >= 65 .AND. nCode <= 90 ) .OR. ; // A-Z
       ( nCode >= 97 .AND. nCode <= 122 ) .OR. ; // a-z
       cChar $ "-_.~"
       
        cResultado += cChar
    ELSE
        // Convertir a formato %XX (hexadecimal)
        cResultado += "%" + hb_NumToHex( nCode, 2 )
    ENDIF
NEXT
RETURN cResultado

saludos
Wilson
ojala le sirva


Re: URLEncoder

Posted: Fri Jan 30, 2026 8:50 pm
by JoséQuintas

Quizás necesites realizar algunas pruebas.

codepage de origen y destino, quizás utf-8 antes de llamar directamente.
Quizás IA muestre algo más práctico.

Los webservices son creados por programadores, no sabemos sí todos siguen estrictamente el estándar.


Re: URLEncoder

Posted: Fri Jan 30, 2026 8:58 pm
by mterraz

Hola Wilson,
Muy buena esa function la utilice y todo funciona correctamente, estos serian los pasos correctos

Generar el XML crudo como el ejemplo anterior.

Pasarlo como valor del parámetro mensaje.

Dejar que la librería HTTP que uses haga el encoding correspondiente al armar el request.

cUrl:='https://tx.itcsoluciones.ar/sitelrest/v ... x&mensaje=' + cXML

oHttp:Open( 'GET' , cUrl , .F. )

Saludos y muy agradecido, Mariano.