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:
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