FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour URLEncoder
Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
URLEncoder
Posted: Fri Jan 30, 2026 02:51 PM

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/xml?version=V251&empresa=devuser1&actividad=01&licencia=desarrollos1234&mensaje='+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

Posts: 104
Joined: Tue Feb 09, 2021 04:20 PM
Re: URLEncoder
Posted: Fri Jan 30, 2026 03:16 PM

No se hace esto ya automaticamente ?

José M. C. Quintas Brazil

gtwvg, fivewin 25.12, hwgui, mingw 15.2 (32 bits)

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: URLEncoder
Posted: Fri Jan 30, 2026 03:24 PM

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

cUrl:='https://tx.itcsoluciones.ar/est/v1/txs/xml?version=V251&empresa=devuser1&actividad=01&licencia=234234&mensaje='+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:

//...................................
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.

Posts: 670
Joined: Wed Oct 19, 2005 06:41 PM
Re: URLEncoder
Posted: Fri Jan 30, 2026 05:35 PM

buenas tardes
talvez esta funcion es lo que busca

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

Wilson 'W' Gamboa A
Wilson.josenet@gmail.com
Posts: 104
Joined: Tue Feb 09, 2021 04:20 PM
Re: URLEncoder
Posted: Fri Jan 30, 2026 08:50 PM

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.

José M. C. Quintas Brazil

gtwvg, fivewin 25.12, hwgui, mingw 15.2 (32 bits)

Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: URLEncoder
Posted: Fri Jan 30, 2026 08:58 PM

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/v1/txs/xml?version=V251&empresa=devuser1&actividad=01&licencia=desarrollosx&mensaje=' + cXML

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

Saludos y muy agradecido, Mariano.

Continue the discussion