Página 1 de 1

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 06:56
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.

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 10:45
por Itamar M. Lins Jr.
Olá!
(?) deve ser isso que está querendo.
tip_URLEncode(), tip_GetEncoder()

Saudações,
Itamar M. Lins Jr.

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 18:43
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?

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 18:51
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.

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 19:18
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...

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 20:21
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.

Converrte datetime para envio em URL

Enviado: 16 Dez 2023 20:41
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.

Converrte datetime para envio em URL

Enviado: 17 Dez 2023 06:27
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.

Converrte datetime para envio em URL

Enviado: 17 Dez 2023 06:42
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.

Converrte datetime para envio em URL

Enviado: 17 Dez 2023 19:38
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

Converrte datetime para envio em URL

Enviado: 18 Dez 2023 06:40
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