Página 1 de 2
Baixar um arquivo da Internet
Enviado: 22 Dez 2022 08:31
por Hasse
Bom dia colegas.
Preciso baixar um arquivo de um determinado endereço da internet, e estou com dificuldades.
O endereço:
"
https://treinamento.olostech.com.br/ips ... ac=4772509"'
O resultado é um pequeno arquivo XML que deve ser gravado no HD.
Alguém pode me indicar o caminho ?
Agradeço de antemão.
Baixar um arquivo da Internet
Enviado: 23 Dez 2022 10:52
por jbsantos
c_URL := "
https://treinamento.olostech.com.br/ips ... ac=4772509"
oHttp := TIpClientHttp():new( c_URL )
oHttp:nConnTimeout := 20000
if ! oHttp:open()
? "Erro de conexao: "+oHttp:lastErrorMessage()
quit
endif
cResultado := oHttp:readAll()
Baixar um arquivo da Internet
Enviado: 23 Dez 2022 15:42
por Hasse
Boa tarde JBSantos
Obrigado pelo teu retorno, mas a tua rotina gerou o erro abaixo:
Error BASE/1081 Operation not supported:
TIPCLIENTHTTP:new() Arguments: ( [ 1] = Type: O Val: {
TIPCLIENTHTTP Object } [ 2] = Type: C Val: https)
Quit
No manual ainda segue uma recomendação como à seguir:
=================================
A url de conexão com o webservice no ambiente de homologação é: https://treinamento.olostech.com.br/ips ... 2.ipso.asp
Conforme descrito no manual a partir da página 11, o comando sugerido para fazer essa conexão é:
curl -k --data "user=xxx&pwd=xxx&service=1&numpac=xxx" https://treinamento.olostech.com.br/ips ... .ipso.asp;
Informando nas variáveis "user" e "pwd" as credenciais que enviei no e-mail anterior (usuário: labjaraguá / senha:123456);
A variável "service", nesse caso será 1, pois estamos fazendo uma consulta. E por fim, temos a variável "numpac" onde será informado o número da autorização;
Se a conexão for bem sucedida, o sistema irá lhe retornar o xml para ser importado:
================================
Na citada página 11 temos somente as outras opções de serviços disponíveis. Para baixar o XML o serviço é 1.
Baixar um arquivo da Internet
Enviado: 23 Dez 2022 21:27
por alxsts
Olá!
A lib hbTip não suporta o protocolo https. Tente usar cUrl.
Baixar um arquivo da Internet
Enviado: 24 Dez 2022 00:53
por Vlademiro
Veja se esse exemplo ajuda
Código: Selecionar todos
*****************************/
FUNCTION __DownloadHTTP( cRemoteFile , lOverwrite , cNewName )
LOCAL hCurl
LOCAL cContent, cFileName
LOCAL lDownload
local aHeaders
#ifdef __PLATFORM__WINDOWS
LOCAL cTempDir := ""//GetEnv("TEMP")
#else
LOCAL cTempDir := ""//IIF( hb_DirExists( "/tmp/" ) , "/tmp/" , "./" )
#endif
IF cNewName == NIL
cFileName := HB_FNameName( cRemoteFile ) + HB_FNameExt( cRemoteFile )
Else
cFileName := cNewName
ENDIF
IF FILE( cFileName ) // Se o arquivo já existe
IF lOverwrite // Se é para sobrepor sempre
lDownload := .t.
ELSE
lDownload := .f.
ENDIF
ELSE // Se não existe é para baixar
lDownload := .t.
ENDIF
IF lDownload
curl_global_init()
if ! empty( hCurl := curl_easy_init() )
aHeaders := { "Cache-Control: no-cache" }
curl_easy_setopt( hCurl, HB_CURLOPT_HTTPHEADER, aHeaders)
curl_easy_setopt( hCurl, HB_CURLOPT_URL, cRemoteFile )
//Disabling the SSL peer verification (you can use it if you have no SSL certificate yet, but still want to test HTTPS)
curl_easy_setopt(hCurl, HB_CURLOPT_FOLLOWLOCATION, 1)
curl_easy_setopt(hCurl, HB_CURLOPT_SSL_VERIFYPEER, 0)
curl_easy_setopt( hCurl, HB_CURLOPT_DL_BUFF_SETUP )
//Sending the request and getting the response
IF (curl_easy_perform( hCurl )) == 0
cContent := curl_easy_dl_buff_get( hCurl )
cFileName := hb_PathJoin( cTempDir, cFileName )
LOG _t( "Downloading to %s", cFileName ) INFO DISPLAY
IF .NOT. hb_MemoWrit( cFileName , cContent )
LOG _t( "Error when writing %s", cFileName ) INFO DISPLAY
ENDIF
ELSE
LOG _t( "Download failed." ) ERROR DISPLAY
IF FILE( cFileName )
?? " Using local version."
ENDIF
ENDIF
ENDIF
ENDIF
RETURN cFileName
Da uma olhada no código, ele não cai funcionar de cara porque tem umas funções minha. Eu tô no celular, fiz só copiar e colar do meu repositório. Pra editar fica difícil e podia errar.
Não esqueça de colocar
#require "hbcurl"
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 11:45
por Hasse
Bom dia.
Testei exaustivamente este último exemplo:
1)-Se uso: #require "hbcurl"
Resposta de erro ao compilar: TST_OLOS_2.PRG(4) Error F0032 Invalid name follows #
2)-Se uso: #include "hbcurl.ch"
Resposta de erro ao compilar: TST_OLOS_2.PRG(6) Error F0029 Can't open #include file: 'hbcurl.ch'
3)-Se uso: #include "C:\xHarbour\contrib\hbcurl\hbcurl.c"
Resposta de erro ao compilar: C:\xHarbour\contrib\hbcurl\hbcurl.c(51) Error F0029 Can't open #include file: 'windows.h'
OBS: procurei este arquivo "windows.h" e não encontrei para testar com o path incluso.
4)-Se uso: #include "C:\xHarbour\contrib\hbcurl\hbcurl.ch"
Resposta de erro ao compilar:
C:\BCC55\BIN\ilink32 @makefile.lnk
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_HB_FNAMENAME' referenced from F:\DEV\PROLAZ1
\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_HB_FNAMEEXT' referenced from F:\DEV\PROLAZ1\
OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_GLOBAL_INIT' referenced from F:\DEV\PRO
LAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_INIT' referenced from F:\DEV\PROLA
Z1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_SETOPT' referenced from F:\DEV\PRO
LAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_PERFORM' referenced from F:\DEV\PR
OLAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_CURL_EASY_DL_BUFF_GET' referenced from F:\DE
V\PROLAZ1\OBJ\TST_OLOS_2.OBJ
Error: Unresolved external '_HB_FUN_HB_PATHJOIN' referenced from F:\DEV\PROLAZ1\
OBJ\TST_OLOS_2.OBJ
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 14:20
por ANDRIL
Se não me engano, na geração do harbour deve inclui-la para que possa ser usado nos programas gerados com ele.
Tente assim:
Código: Selecionar todos
//--url de consulta
cURL="https://treinamento.olostech.com.br/ipso/controle_v1.2.ipso.asp?user=labjaragua&pwd=123456&service=1&numpac=4772509"
//--caso precise enviar algo no body
cJSON=""
//--define o metodo HTTP use conforme a API ou url solicita, geralmente, será GET
cMetodo="GET"
//--cria o servidor HTTP local
oServer := win_OleCreateObject( "MSXML2.ServerXMLHTTP.5.0" )
oServer:Open( cMetodo, cURL, .F. )
//--caso precise setar header
*oServer:SetRequestHeader( "Accept","application/json")
*oServer:SetRequestHeader( "Content-Type","application/json")
//--envia url ao servidor
oServer:Send( cJSON )
//--retorno da url
cRetorno := oServer:ResponseBody()
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 15:05
por Vander
Olá;
Já tentou usar um programinha chamado "wget" que funciona em linha de comando.
Testei com Windows 10 Pro de 64 bits e o resultado foi este :
Código: Selecionar todos
<?xml version='1.0' encoding='ISO-8859-1'?><ipso><status><codigo type='varchar(10)'>E102</codigo><servico type='integer'>1</servico><numpac type='bigint'>4772509</numpac><versao type='varchar(7)'>1.2</versao></status></ipso>
Código
Código: Selecionar todos
//
LOCAL cCommand := 'wget -O arquivo_de_saida.XML --no-check-certificate "https://treinamento.olostech.com.br/ipso/controle_v1.2.ipso.asp?user=labjaragua&pwd=123456&service=1&numpac=4772509"'
RUN (cCommand)
//
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 15:27
por Vander
No navegador Edge

Baixar um arquivo da Internet
Enviado: 26 Dez 2022 16:50
por Hasse
Caro Vander.
Sim, no navegador carrega normalmente, porém preciso que o arquivo seja salvo no HD automaticamente, pois são uns 20 a 30 arquivos diários.
Estes arquivos devem ser gravados no HD, lidos, tratados e gravados no sistema local.
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 16:57
por Vander
O "wget" baixa o arquivo e pode ser salvo em qualquer pasta e o nome do arquivo de origem e destino podem ser uma Variável.
LOCAL cCommand := 'wget -O
arquivo_de_saida.XML --no-check-certificate "
https://treinamento.olostech.com.br/ips ... ac=4772509"'
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 17:20
por Hasse
OK.
Beleza.
Funcionou perfeito com o wget.
Obrigado a TODOS que me auxiliaram direta ou inderetamente.
Baixar um arquivo da Internet
Enviado: 26 Dez 2022 19:55
por Vlademiro
Uso a solução que postei sem problemas com o Harbour 3.2 compilado com suporte a cUrl. Uso o mingw para compilar. No Linux uso gcc. Faz tempo que abandonei o xharbour e o bcc. Talvez não tenha suporte a cUrl. Nesse caso é melhor usar o wget.
Baixar um arquivo da Internet
Enviado: 27 Dez 2022 09:15
por sygecom
Vlademiro escreveu:Uso a solução que postei sem problemas com o Harbour 3.2 compilado com suporte a cUrl. Uso o mingw para compilar. No Linux uso gcc. Faz tempo que abandonei o xharbour e o bcc. Talvez não tenha suporte a cUrl. Nesse caso é melhor usar o wget.
Só para deixar registrado, funciona com xHarbour+BCC, estamos usando aqui.
Baixar um arquivo da Internet
Enviado: 28 Jan 2023 20:36
por dbsh
Se for no window, tenta este, não precisa incluir nenhuma biblioteca.
Código: Selecionar todos
FUNCTION Download_WinHttpRequest( sUrl, lErro )
LOCAL oOle, sTexto
lErro := .F.
BEGIN SEQUENCE WITH Break()
sTexto := "ERRO: CreateObject(WinHttp.WinHttpRequest.5.1)"
IF ( oOle := win_oleCreateObject( "WinHttp.WinHttpRequest.5.1" ) ) != NIL
sTexto := 'ERRO: Open(GET) [' + sUrl + ']'
oOle:Open( "GET", sUrl, .F. )
sTexto := 'ERRO: Send() [' + sUrl + ']'
oOle:Send()
//sTexto := "ERRO: readyState"
//WHILE oOle:readyState <> 4
// oOle:waitForResponse( 1000 )
//ENDDO
sTexto := 'ERRO: Status [' + sUrl + ']'
IF oOle:Status() == 200
sTexto := oOle:responseBody
ELSE
sTexto := 'ERRO: WinHttp.WinHttpRequest.5.1 STATUS: ' + NTrim(oOle:Status()) + ' [' + sUrl + ']'
lErro := .T.
ENDIF
ELSE
sTexto := 'ERRO: CreateObject(WinHttp.WinHttpRequest.5.1) [' + win_oleErrorText() + '] [' + sUrl + ']'
lErro := .T.
ENDIF
RECOVER
IF Empty(sTexto) .or. Left(sTexto, 5) <> 'ERRO:'
//sTexto := 'ERRO: ao baixar; [' + sUrl + ']'
sTexto := ''
ENDIF
lErro := .T.
END SEQUENCE
RETURN sTexto
set retornar string vazia, deu erro no download
ou passe lErro por referencia