Como baixar arquivos http?

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

Moderador: Moderadores

carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Como baixar arquivos http?

Mensagem por carlos_dornelas »

Pessoal, bom dia!

Estou tendo alguns problemas utilizando a rotina abaixo para baixar arquivos via http... o arquivo é baixado, porém é uma versão desatualizada do mesmo: parece que puxa de algum lugar do PC mesmo e não da internet... se eu baixo direto pelo navegador, o arquivo vem correto e atualizado.

Código: Selecionar todos

FUNCTION BaixarURLMON(url,arq)

nHandleDLL:=hb_LibLoad("UrlMon.dll")

nStatus:=hb_dynCall( { "URLDownloadToFileA", nHandleDLL,HB_DYN_CALLCONV_STDCALL},0,url,arq,0,0)


hb_LibFree(nHandleDLL)
RETURN Nil
Como vocês fazem para baixar via http?

Estou utilizando o harbour 3.2 night

[]s

Antonio Carlos
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Como baixar arquivos http?

Mensagem por carlos_dornelas »

Prezados,

Após mais pesquisas aqui no forum, encontrei mais algumas opções, mas ainda sem sucesso... Vejam só, das três funções abaixo, só a primeira que utiliza a DLL baixa o arquivo, porém o baixa desatualizado, o interessante é que se baixar o arquivo .zip direto pelo navegador o arquivo vem sempre o mais recente disponível... as outras duas funções baixa um arquivo .zip zerado.

O que está errado?

[]s

Antonio Carlos

Código: Selecionar todos


BaixarURLMON("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","pri_loteca.zip")

Baixamur("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","seg_loteca.zip")

Baixe("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","ter_loteca.zip")



FUNCTION BaixarURLMON(url,arq)
nHandleDLL:=hb_LibLoad("UrlMon.dll")
nStatus:=hb_dynCall( { "URLDownloadToFileA", nHandleDLL,HB_DYN_CALLCONV_STDCALL},0,url,arq,0,0)
hb_LibFree(nHandleDLL)
RETURN Nil


function baixamur(url,arq)
cDownload := url
nSizeFiles := 1000000 // size inf bytes of the file
oUrl2 := tURL():New( cDownload )
lSuccess := .F.
WITH OBJECT ( TIPClientHTTP():New( oUrl2 ) )
   :nConnTimeout := 5000
   IF :Open( oUrl2 )
      :ReadToFile(arq,, 1000000 )
      :Close()
      lSuccess := .T.
   ENDIF
END


function baixe(url,arq)
oConn := TipClientHttp():New(TURL():New(URL))
oConn:nConnTimeout := 10000
IF oConn:Open(URL)
   oConn:ReadToFile(arq)
   oConn:Close()
ENDIF
Avatar do usuário
Marcio-MMM
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 05 Fev 2021 09:44
Localização: São Paulo / SP

Como baixar arquivos http?

Mensagem por Marcio-MMM »

Uso o TipClientHTTP: e estou tendo o mesmo problema : baixa o arquivo com ZERO BYTES.
Retorna Generic error in writing
o Reply dá HTTP/1.1 400 Bad Request

Pelo Navegador, baixa direitinho...

Código: Selecionar todos

cUrl="http://provedor.com.br/"+alltrim(cFile)+" "+alltrim(cFile)
oUrl := TUrl():New( cUrl )
IF Empty( oUrl )
      @ 4, 5 SAY "Invalid url " + cUrl
ENDIF

oClient := TIPClientHTTP():new( oUrl )

IF Empty( oClient )
   	 return ""
ENDIF
oClient:nConnTimeout :=  20000 

IF oClient:Open()
   	@ 2,1 say cUrl
   	@ 3,1 say oUrl
   	@ 4,1 say cFile

	IF oClient:ReadToFile( cFile )
		 @ 7, 5 SAY "File " + cFile + " written."
		 @ 8, 5 SAY "Server replied " + oClient:cReply
	ELSE
		 @ 7, 5 SAY "Generic error in writing."  + cFile
	ENDIF
                        
      oClient:Close()
      @ 14,1 say oClient:cReply
      inkey(0)
ENDIF
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como baixar arquivos http?

Mensagem por JoséQuintas »

Código: Selecionar todos

FUNCTION DownloadTexto( cUrl )

   LOCAL oSoap, cRetorno

   cRetorno := ""
   BEGIN SEQUENCE WITH __BreakBlock()
      oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
      oSoap:Open( "GET", cUrl, .F.)
      oSoap:Send()
      cRetorno := oSoap:ResponseBody()
   END SEQUENCE

   RETURN cRetorno
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/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como baixar arquivos http?

Mensagem por JoséQuintas »

Com este outro funciona com ftp, talvez pra upload/download.

Código: Selecionar todos

PROCEDURE Main

   LOCAL a, b

   a := win_OleCreateObject( "microsoft.XMLHTTP" )
   a:Open( "GET", "ftp://ftp.josequintas.com.br/www/arquivos/jpa.exe", .F., "xxx", "xxx" )
   a:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
   a:Send()
   b := a:ResponseBody()
   ? Len( b )
   hb_MemoWrit( "test.xxx", b )

   RETURN
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/
Avatar do usuário
Marcio-MMM
Usuário Nível 1
Usuário Nível 1
Mensagens: 11
Registrado em: 05 Fev 2021 09:44
Localização: São Paulo / SP

Como baixar arquivos http?

Mensagem por Marcio-MMM »

Valeu Quintas, de novo, matou a pau...
Grato demais.
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Como baixar arquivos http?

Mensagem por JAIR RANGEL »

Olá, Mestres

Testando a rotina do Quintas para download de um arquivo.zip

Estou tentando baixar um arquivo .zip do Google Drive.
A rotina sempre baixa um arquivo em formato xml...

Teria como baixar somente o arquivo .zip que está no pasta do Google Drive?
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como baixar arquivos http?

Mensagem por JoséQuintas »

Vai ter que ver como funcionam as APIs do google drive.
Tentou baixar o mesmo link, SEM SER NO NAVEGADOR, pra ver se funciona?
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/
Avatar do usuário
Linguagemclipper
Usuário Nível 3
Usuário Nível 3
Mensagens: 240
Registrado em: 16 Abr 2016 17:33
Localização: Maceió/AL
Contato:

Como baixar arquivos http?

Mensagem por Linguagemclipper »

Carlos, muitos servidores de páginas dinâmicas usam cache. Se o arquivo tem sempre o mesmo nome é provável que você esteja baixando do cache caso o arquivo esteja na pasta public_html que é onde ficam as páginas da web.
Por este motivo, recomendo que crie um diretório fora da pasta public_html para não sofrer esta ação do cache. Exemplo:

Código: Selecionar todos

cFTPFILE := "example.com/downloads/arquivo.zip" // coloque o caminho e nome do arquivo aqui
// FTP CREDENTIALS
oURL           := TUrl():new()
oUrl:cProto    := "ftp"
oUrl:cUserid   := cFTPUSER  
oUrl:cPassword := cFTPPASS  
oUrl:cServer   := cFTPSERVER
oUrl:nPort     := nFTPPORT  
oFTP := TIpClientFtp():new( oURL ) // ABRE CONEXÃO FTP  				
lCONEXAO := .T.
IF oFTP:OPEN()							
	MSGRODA("Verificando se há uma nova versão...", "W+/BG")
	IF oFTP:DOWNLOADFILE(cFTPFILE)
                   // [...]
	ENDIF 
ENDIF
Aliás, deixei de usar TIpClientHttp() por conta dessas coisas. Estou usando o FTP aí mesmo que é o protocolo de transmissão de arquivos.
Usando xHarbour v1.2.3 Rev. 10264 + BCC 5.8, Elchs' LetoDBf, DBFCDX e SIBRA para imprimir relatórios.
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Como baixar arquivos http?

Mensagem por JAIR RANGEL »

Olá, Pessoal

Não consegui baixar o arquivo.zip do Google Drive. Estava utilizando a TIPClientHTTP(), mas sem sucesso. Tentei também configurando para https, mas não rolou. Então, voltei com a rotina utilizando a TIPClientFTP(), a qual sempre funcionou de boa, baixando arquivo.zip no provedor DecolarHost. No entanto, este provedor anunciou a paralização do serviço a partir de Novembro/2022. Por este motivo estou tentando outra solução. Como o Google Drive é gratuíto até 15GB tentei usar alterando a função para TIPClientHTTP(). Mas como mencionei acima, não funcionou aqui...

Depois de voltar com a função TIPClientHTTP() contratei outro serviço de FTP no provedor FTPCloud.com.br
Acabei de fazer o cadastro no site. O bom é que podemos usar por 7 dias para testes, sem pagar nada por isso. Então, vou tentar fazer funcionar.

No momento estou aguardando a liberação das credenciais de acesso ao Server FTP da FTPCloud.

Não sei vocês, mas cada vez mais vejo que o trabalho de desenvolvimento desktop está em seus últimos dias...

Obrigado á todos
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
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

Como baixar arquivos http?

Mensagem por Itamar M. Lins Jr. »

Olá!
Testou esse aqui ?
https://drfone.wondershare.com.br/cloud ... drive.html
Imagem
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JAIR RANGEL
Usuário Nível 3
Usuário Nível 3
Mensagens: 178
Registrado em: 19 Jul 2005 16:01
Localização: RIO DE JANEIRO
Contato:

Como baixar arquivos http?

Mensagem por JAIR RANGEL »

Bom dia, Amigos

Depois da liberação do novo servidor FTP a rotina de acesso voltou a funcionar. O problema era mesmo o servidor antigo: DecolarHost

Segue a rotina que uso para acesso:

Código: Selecionar todos

// =============================================================================
STATIC Function ATUALIZACAO_Automatica()    // ATUALIZAÇÃO AUTOMÁTICA de Versões
// =============================================================================
LOCAL cFile:="admv"+novaVersao+".zip"                           // Arq.Compactado de Atualização de Versão
LOCAL cTable:="ADMSTATUS.DBF", lVerify                          // lVerify: Var.boleana=Verifica se Cliente ATIVO/INATIVO p/atualização

ftpproto := "ftp://"                                            // Protocolo FTP
ftpuser  := "admsmart"                                          // Usuário da conta FTP
ftppass  := "nnnnnnnnnnnn"                                      // Senha da conta FTP
ftpserver:= "endereço server"                                   // Endereço de FTP
ftpPort  := 21                                                  // Porta, caso seja necessário informar na Url

cUrl     := ftpproto+ftpuser+":"+ftppass+"@"+ftpserver          // Url ftp
oUrl     := TUrl():new(cUrl)
oCred    := TIPCredentials()

oFTP     := TIPClientFTP():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv := .T.

If FILE("ADMINSTAUTO.exe")                  // Se Instalador ADM existe, exclui o mesmo
   FERASE("ADMINSTAUTO.exe")
EndIf

If oFTP:Open()                              // Abre Conexão com Servidor FTP
   WAIT WINDOW "                Verificando atualização disponível. Aguarde...                   " NOWAIT

   oFTP:Cwd("/atualizacao")                 // Informa o DIRETORIO (no servidor FTP) onde está o Arquivo de atualização a ser baixado

   oFTP:DownLoadFile(cTable)                // Realiza Download da Tabela de STATUS de clientes do servidor FTP

   If ! FILE(cTable)                        // Verifica se Tabela Status Cliente foi baixada
      MsgINFO('PROBLEMA NA TRANSMISSÃO                       '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'Ocorreu um problema ao receber arquivos de    '+Chr(10)+Chr(13)+ ;
              'atualização.                                  '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'O acesso a internet pode estar com algum      '+Chr(10)+Chr(13)+ ;
              'problema momentâneo...                        '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13),'Atenção')
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   lVerify:=VerifyClient(cTable)            // Verifica se Cliente está liberado para ATUALIZAÇÃO de Versão
   If ! lVerify                             // Cliente NÃO HABILITADO para Atualização Automática de Versão...
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   WAIT CLEAR                               // Fecha Janela de Mensagem
   WAIT WINDOW "                Realizando download de atualização. Aguarde...                   " NOWAIT

   If ! FILE(cFile)                         // Verifica se Arquivo de atualização foi BAIXADO ANTERIORMENTE
      oFTP:DownLoadFile(cFile)              // Realiza Download do Arquivo
   EndIf

   If ! FILE(cFile)                         // Verifica se Arquivo de atualização foi BAIXADO
      MsgINFO('ATUALIZAÇÃO NÃO ENCONTRADA          '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'A atualização NÃO foi localizada    '+Chr(10)+Chr(13)+ ;
              'no Servidor web                     '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'Uma nova tentativa será feita ao    '+Chr(10)+Chr(13)+ ;
              'reabrir o Sistema...                '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13),'Atenção')
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   If FILE(cFile)                           // Verifica se Arquivo de atualização foi baixado
      If hb_zipFileCRC32(cFile) = 0         // Verifica INTEGRIDADE do Arq.ZIP. Se Diferente de ZERO, é pq o CRC32 do Arq. está OK.
         MsgINFO('ARQUIVO '+cFile+' DANIFICADO                   ' +Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'O Arquivo de próxima atualização do Sistema    '+Chr(10)+Chr(13)+ ;
                 'ADM Smart está corrompido.                     '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'Assim que reabrir o ADM PAINEL este arquivo    '+Chr(10)+Chr(13)+ ;
                 'será baixado novamente.                        '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'Caso esta mensagem continue a aparecer,        '+Chr(10)+Chr(13)+ ;
                 'contactar o Suporte.                           '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13),'Atenção')

         FERASE(cFile)                      // Deleta Arquivo de Atualização
         oFTP:Close()                       // Encerra Conexão com Servidor FTP
         WAIT CLEAR                         // Fecha Janela de Mensagem
         Return Nil                         // Encerra Rotina de ATUALIZAÇÃO
      EndIf
      WAIT CLEAR                            // Fecha Janela de Mensagem
      AtualizarVersao(cFile)
   EndIf
Else
   MsgINFO('CONEXÃO NEGADA                                         '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'Não foi possível verificar por atualizações do         '+Chr(10)+Chr(13)+ ;
           'ERP-ADM Smart                                          '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'O acesso a internet pode estar com algum problema      '+Chr(10)+Chr(13)+ ;
           'momentâneo                                             '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'Uma nova tentativa de conexão será feita ao reabrir    '+Chr(10)+Chr(13)+ ;
           'o ADM PAINEL...                                        '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13),'Atenção')
EndIf
oFTP:Close()                                // Encerra Conexão com Servidor FTP
CANCELAR_Atualizacao()
WAIT CLEAR                                  // Fecha Janela de Mensagem
Return
Mais uma vez, obrigado pela atenção dos nobres amigos!
MINIGUI + HARBOUR + BRMAKE + CDX
CLIPPER 5.2E + VISUALLIB 2 + BLINKER
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Como baixar arquivos http?

Mensagem por clodoaldomonteiro »

Muito boa as dicas, já uso CreateObject("MSXML2.ServerXMLHTTP"), inclusive pra consumir API de consulta de dados de empresas passando CNPJ.

Código: Selecionar todos

   ////////////////////////////////////////////////////////////////////////////////
   //https://pctoledo.org/forum/viewtopic.php?f=43&p=155455#p155455
   //https://pctoledo.org/forum/viewtopic.php?f=4&t=23628 (com Header)
   //https://pctoledo.org/forum/viewtopic.php?f=4&t=17427 (usando a  hb_JSONDecode( cJSON, @hJSON ) )
   //https://nfe.io/docs/desenvolvedores/rest-api/consulta-de-cnpj-v1/ (para consultas)
   //https://pctoledo.org/forum/viewtopic.php?f=4&p=148594#p148594 (pode fazer FTP)
Function CNPJ_Consulta( cCnpj )
   Local mSite := "http://receitaws.com.br/v1/cnpj/", oHttp, hCNPJA := Hash(), mJSONCNPJ, hJSON := Hash()
   //mSite := "https://publica.cnpj.ws/cnpj/" //mais completo

   If Len( cCnpj ) <> 14
      REturn NIL
   Endif

   Begin Sequence

      Try
         oHttp := CreateObject("MSXML2.ServerXMLHTTP")
         oHttp:Open("GET", mSite + cCNPJ, .F.)
         oHttp:send()
      CATCH oError
         msg := 'Internet Error: 010' + CRLF
         msg += 'Aviso..: Erro verificado ao fazer requisição de CNPJ no Site indicado.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += cl_getError(oError, .t.)

         msgError ( msg )

         hCNPJA := NIL

         Break
      End

      If Empty( oHttp:responseText )
         hCNPJA := NIL
         Break

      ElseIf '"ERROR"' $ oHttp:responseText
         msg := 'Request error: 015' + CRLF
         msg += 'Aviso..: O retorno da consulta de CNPJ está com erros.' + HB_Eol()
         msg += '- Aguarde um minuto e tente novamente.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += 'Response:' + oHttp:responseText + HB_Eol()
         msg += 'Status..:' + Str(oHttp:status, 3) + HB_Eol()
         msg += cl_getError(, .t.)

         MsgError ( msg, .t. )

         hCNPJA := NIL
         Break

      ElseIf 'Too many' $ oHttp:responseText
         msg := 'Request error: 020' + CRLF
         msg += 'Aviso..: Muitas tentativas de pesquisar CNPJ no Site indicado.' + HB_Eol()
         msg += '- Aguarde um minuto e tente novamente.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += 'Response:' + oHttp:responseText + HB_Eol()
         msg += 'Status..:' + Str(oHttp:status, 3) + HB_Eol()

         MsgAtencao ( msg )

         hCNPJA := NIL
         Break
      Endif

      mJSONCNPJ   := HB_AnsiToOem(oHttp:responseText)

      //ADOStringGrava(mJSONCNPJ + CRLF)

      hCNPJA      := JSontoHash( mJSONCNPJ )

      oHttp       := NIL

   End Sequence

   Return hCNPJA

   /////////////////////////////////////////////////////////////////////////////
   //https://www.linguagemclipper.com.br/aprendendo-hash
Function JSonToHash( cStringJson )
   /***
   * Converte string formato Json em Hash
   */
   Local hJson := {=>}

   cStringJson := StrTran( cStringJson, ':[','=>{')
   cStringJson := StrTran( cStringJson, '":"','" => "')
   cStringJson := StrTran( cStringJson, '[','{')
   cStringJson := StrTran( cStringJson, ']','}')
   cStringJson := StrTran( cStringJson, '":null','"=>nil')
   cStringJson := StrTran( cStringJson, '":true' ,'"=>.t.' )
   cStringJson := StrTran( cStringJson, '":false','"=>.f.')
   cStringJson := StrTran( cStringJson, '":','"=>')
   cStringJson := StrTran( cStringJson, "\/","/" )

   hJSon := &( cStringJson )

   Return hJson

   /////////////////////////////////////////////////////////////////////////////
Function cl_LimpaString( cString )
   Local mRetorno

   mRetorno := StrTran( cString, '.', '' )
   mRetorno := StrTran( mRetorno, '-', '' )
   mRetorno := StrTran( mRetorno, '/', '' )
   mRetorno := StrTran( mRetorno, '\', '' )
   mRetorno := StrTran( mRetorno, ',', '' )

   Return mRetorno

   /////////////////////////////////////////////////////////////////////////////
Function cl_NulToString( cString )
   cString := If(cString = NIL, '', cString )
   Return cString
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder