Converrte datetime para envio em URL

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Converrte datetime para envio em URL

Mensagem por gilbertosilverio »

Ola Amigos,

Existe alguma funcao que converta um datetime para envio em uma URL?

No SoapUi no envio ele converte 2023-12-15 21:00:00 em 2023-12-15%2021%3A00%3A00"

Preciso enviar essa Query usando MSXML2.ServerXMLHTTP.6.0 mais não sei como converte este datetime, ou se existe ano no MSXML2.ServerXMLHTTP.6.0 que converta diretamente essa query.

Código: Selecionar todos


dt_ultima_requisicao := 2023-12-15 21:00:00

/cotacao-suprimento/?dt_ultima_requisicao=2023-12-15%2021%3A00%3A00"

Agradeço a ajuda.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Converrte datetime para envio em URL

Mensagem por Itamar M. Lins Jr. »

Olá!
(?) deve ser isso que está querendo.
tip_URLEncode(), tip_GetEncoder()

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Converrte datetime para envio em URL

Mensagem por alxsts »

Olá!
Itamar M. Lins Jr. escreveu:(?) deve ser isso que está querendo.
tip_URLEncode(), tip_GetEncoder()
Eu não conhecia estas funções...

Um pequeno teste com tip_URLEncode() e tip_URLDecode() (tip_GetEncoder() não sei para que serve):

Código: Selecionar todos

// Compilar: hbmk2 teste hbtip.hbc
// Alexandre Santos
// 16/12/2023

REQUEST HB_CodePage_UTF8
REQUEST HB_LANG_PT    

PROCEDURE Teste()

   LOCAL cURL, dt_ultima_requisicao 

   HB_CdpSelect( "UTF8" )
   hb_langSelect( "PT" )

   dt_ultima_requisicao := hb_TtoC( hb_DateTime(), "dd-mm-yyyy", "hh:mm:ss" )

   cURL := "/cotacao-suprimento/?dt_ultima_requisicao=" + ;
           tip_URLEncode( dt_ultima_requisicao )

   Alert( "Data: " + dt_ultima_requisicao + ";URL:" + cURL,, "W+/B" )

   Alert( "Decodificado: ;" + tip_URLDecode( cURL ),, "W+/B"  )
QUIT
Resultado:
Capturar.JPG
Dúvida:
gilbertosilverio escreveu:/cotacao-suprimento/?dt_ultima_requisicao=2023-12-15%2021%3A00%3A00"
No meu teste, os hífens da data foram codificados. No exemplo fornecido não foram. Por que? É para codificar somente a hora?
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Converrte datetime para envio em URL

Mensagem por JoséQuintas »

O espaço em branco é separador e não pode existir, por isso ele é codificado.
Acho que aconteceria o mesmo com outros caracteres que possam afetar o resultado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Converrte datetime para envio em URL

Mensagem por alxsts »

Olá!

Comparando o exemplo postado com o retorno da função, o espaço em branco foi representado por %20 no primeiro e pelo sinal + no segundo. Os hifens que existem no primeiro foram trocados por %2D no segundo e os pontos e vírgulas estão iguais nos dois (%3A).

Minha pergunta é: por que, no exemplo original, os hifens existem e no retorno da função foram trocados por %2D ? Será que o exemplo está errado? Creio que o retorno da função está correto...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Converrte datetime para envio em URL

Mensagem por Itamar M. Lins Jr. »

Olá!
Minha pergunta é: por que, no exemplo original,
...
Pois eu sei dessas funções por conta do uHttpd, de programas que fiz em (CGI) priscas eras, com Harbour.
Se não estou enganado tem Encode e Decode...

/contrib/hbhttpd/core.prg -> no 3.4 é diferente...Minhas andanças nos fontes.

Código: Selecionar todos

FUNCTION UHtmlEncode( cString )

   LOCAL nI, cI, cRet := ""

   FOR nI := 1 TO Len( cString )
      cI := SubStr( cString, nI, 1 )
      IF cI == "<"
         cRet += "<"
      ELSEIF cI == ">"
         cRet += ">"
      ELSEIF cI == "&"
         cRet += "&"
      ELSEIF cI == '"'
         cRet += """
      ELSE
         cRet += cI
      ENDIF
   NEXT

   RETURN cRet

FUNCTION UUrlEncode( cString )

   LOCAL nI, cI, cRet := ""

   FOR nI := 1 TO Len( cString )
      cI := SubStr( cString, nI, 1 )
      IF cI == " "
         cRet += "+"
      ELSEIF Asc( cI ) >= 127 .OR. Asc( cI ) <= 31 .OR. cI $ '=&%+'
         cRet += "%" + hb_StrToHex( cI )
      ELSE
         cRet += cI
      ENDIF
   NEXT

   RETURN cRet

FUNCTION UUrlDecode( cString )

   LOCAL nI

   cString := StrTran( cString, "+", " " )
   nI := 1
   DO WHILE nI <= Len( cString )
      nI := hb_At( "%", cString, nI )
      IF nI == 0
         EXIT
      ENDIF
      IF Upper( SubStr( cString, nI + 1, 1 ) ) $ "0123456789ABCDEF" .AND. ;
            Upper( SubStr( cString, nI + 2, 1 ) ) $ "0123456789ABCDEF"
         cString := Stuff( cString, nI, 3, hb_HexToStr( SubStr( cString, nI + 1, 2 ) ) )
      ENDIF
      nI++
   ENDDO

   RETURN cString
Se não me falha a memória no mod_harbour tem umas dessas mais bem trabalhadas.(mais completas)

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Converrte datetime para envio em URL

Mensagem por Itamar M. Lins Jr. »

Olá!
Tô dizendo...
Jogaram de PRG para C.

Código: Selecionar todos

#include "hbapi.h"
#include "hbapiitm.h"
#include "hbapierr.h"

HB_FUNC( TIP_URLENCODE )
{
   const char * pszData = hb_parc( 1 );

   if( pszData )
   {
      HB_ISIZ nLen = hb_parclen( 1 );

      if( nLen )
      {
         HB_BOOL bComplete = hb_parldef( 2, HB_TRUE );
         HB_ISIZ nPos = 0, nPosRet = 0;

         /* Giving maximum final length possible */
         char * pszRet = ( char * ) hb_xgrab( nLen * 3 + 1 );

         while( nPos < nLen )
         {
            char cElem = pszData[ nPos ];

            if( cElem == ' ' )
            {
               pszRet[ nPosRet ] = '+';
            }
            else if( ( cElem >= 'A' && cElem <= 'Z' ) ||
                     ( cElem >= 'a' && cElem <= 'z' ) ||
                     ( cElem >= '0' && cElem <= '9' ) ||
                     cElem == '.' || cElem == ',' || cElem == '&' ||
                     cElem == '/' || cElem == ';' || cElem == '_' )
            {
               pszRet[ nPosRet ] = cElem;
            }
            else if( ! bComplete && ( cElem == ':' || cElem == '?' || cElem == '=' ) )
            {
               pszRet[ nPosRet ] = cElem;
            }
            else /* encode! */
            {
               HB_UINT uiVal;
               pszRet[ nPosRet++ ] = '%';
               uiVal = ( ( HB_UCHAR ) cElem ) >> 4;
               pszRet[ nPosRet++ ] = ( char ) ( ( uiVal < 10 ? '0' : 'A' - 10 ) + uiVal );
               uiVal = ( ( HB_UCHAR ) cElem ) & 0x0F;
               pszRet[ nPosRet ] = ( char ) ( ( uiVal < 10 ? '0' : 'A' - 10 ) + uiVal );
            }

            nPosRet++;
            nPos++;
         }

         hb_retclen_buffer( pszRet, nPosRet );
      }
      else
         hb_retc_null();
   }
   else
      hb_errRT_BASE( EG_ARG, 3012, NULL,
                     HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) );
}

HB_FUNC( TIP_URLDECODE )
{
   const char * pszData = hb_parc( 1 );

   if( pszData )
   {
      HB_ISIZ nLen = hb_parclen( 1 );

      if( nLen )
      {
         HB_ISIZ nPos = 0, nPosRet = 0;

         /* maximum possible length */
         char * pszRet = ( char * ) hb_xgrab( nLen );

         while( nPos < nLen )
         {
            char cElem = pszData[ nPos ];

            if( cElem == '%' && HB_ISXDIGIT( pszData[ nPos + 1 ] ) &&
                                HB_ISXDIGIT( pszData[ nPos + 2 ] ) )
            {
               cElem = pszData[ ++nPos ];
               pszRet[ nPosRet ]  = cElem - ( cElem >= 'a' ? 'a' - 10 :
                                            ( cElem >= 'A' ? 'A' - 10 : '0' ) );
               pszRet[ nPosRet ] <<= 4;
               cElem = pszData[ ++nPos ];
               pszRet[ nPosRet ] |= cElem - ( cElem >= 'a' ? 'a' - 10 :
                                            ( cElem >= 'A' ? 'A' - 10 : '0' ) );
            }
            else
               pszRet[ nPosRet ] = cElem == '+' ? ' ' : cElem;

            nPos++;
            nPosRet++;
         }

         /* this function also adds a zero */
         /* hopefully reduce the size of pszRet */
         hb_retclen_buffer( ( char * ) hb_xrealloc( pszRet, nPosRet + 1 ), nPosRet );
      }
      else
         hb_retc_null();
   }
   else
      hb_errRT_BASE( EG_ARG, 3012, NULL,
                     HB_ERR_FUNCNAME, 1, hb_paramError( 1 ) );
}
Eu sabia que tinha pq usei algumas vezes era em .prg(se não me engano)
Tip_urlEncode() e Tip_urldecode()

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Converrte datetime para envio em URL

Mensagem por gilbertosilverio »

Olá amigos,

Agradeço a todos pela ajuda, mais infelizmente não funciona.

Criei uma rotina, pois somente preciso converter o formato time(), onde altero o espaço e os dois pontos, deixando no formato que preciso enviar:

?dt_ultima_requisicao=2023-12-15%2021%3A00%3A00

como e feito no SoapUI em que testei.

Dessa maneira consigo obter os dados de retorno.

Fiquei curioso para saber se existia algo pronto no hb.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Converrte datetime para envio em URL

Mensagem por gilbertosilverio »

Ola amigos,

Pesquisando na net, tip_URLEncode(), achei esse site que converte...

Observe que ele faz exatamente como deve ser, fica a dica.
Anexos
Captura de tela 2023-12-17 070401.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Converrte datetime para envio em URL

Mensagem por alxsts »

Olá!
gilbertosilverio escreveu:Criei uma rotina, ...

Código: Selecionar todos

PROCEDURE Teste()

   LOCAL cURL, dt, hr

   CLS

   dt := Date()
   hr := Time()
   cURL := "/cotacao-suprimento/?dt_ultima_requisicao=" + ;
           Transform( DtoS( dt ), "@R 9999-99-99") + "%20" + ;
           StrTran( hr, ":", "%3A" )

   Alert( "Data: " + Transform(dt, "@E") + "  Hora: " + hr + ";URL:" + cURL,, "W+/B" )

QUIT
Resultado: /cotacao-suprimento/?dt_ultima_requisicao=2023-12-17%2020%3A02%3A52
[]´s
Alexandre Santos (AlxSts)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Converrte datetime para envio em URL

Mensagem por gilbertosilverio »

Ola amigos,


Alexandre, baseado em minha necessidade, fiz assim:

Código: Selecionar todos


FUNCTION AcrescentaTempo( dias, horas, minutos, segundos )   // soma tempo a data atual
    LOCAL tResulta  := hb_DateTime()
    LOCAL tINICIO, tFINAL

    tINICIO:=tRESULTA

    IF dias > 0
       tRESULTA := tRESULTA += DIAS
    ENDIF

    IF horas > 0
       tRESULTA := tRESULTA += (HORAS/24)
    ENDIF

    IF minutos > 0
       tRESULTA := tRESULTA += (MINUTOS / (24*60) )
    ENDIF

    IF segundos > 0
       tRESULTA := tRESULTA += ( SEGUNDOS / (24*3600) )
    ENDIF

    tFINAL := RETIRAB(hb_TToC( tRESULTA, "YYYY-MM-DD", "%20HH%3AMM%3ASS" ))

    HWG_MSGINFO( [Inicio: ]+ hb_ttoc(tINICIO)+CRLF+ [tFinal: ]+ tFINAL )

RETURN NIL

FUNCTION TiraTempo(dias, horas, minutos, segundos)     // subtrai tempo da data atual
    LOCAL tResulta  := hb_DateTime()
    LOCAL tINICIO

    tINICIO:=tRESULTA

    IF dias > 0
       tRESULTA := tRESULTA -= DIAS
    ENDIF

    IF horas > 0
       tRESULTA := tRESULTA -= (HORAS/24)
    ENDIF

    IF minutos > 0
       tRESULTA := tRESULTA -= (MINUTOS / (24*60) )
    ENDIF

    IF segundos > 0
       tRESULTA := tRESULTA -= ( SEGUNDOS / (24*3600) )
    ENDIF

    tFINAL := RETIRAB(hb_TToC( tRESULTA, "YYYY-MM-DD", "%20HH%3AMM%3ASS" ))

    HWG_MSGINFO( [Inicio: ]+ hb_ttoc(tINICIO)+CRLF+ [tFinal: ]+ tFINAL )

RETURN NIL

FUNCTION RetiraB( cStr,  lAll )
   LOCAL nI
   LOCAL cChar
   LOCAL Ret := ""
   local lTudo := .T.
   local lAnsi := .F.
   IF lAnsi
      cStr := STRTRAN(cStr, " ", "")
   ELSE
      cStr := STRTRAN(cStr, " ", "")
   ENDIF
RETURN cStr

Anexos
Captura de tela 2023-12-18 070009.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Responder