Página 1 de 2

JSON para HASH com PDF

Enviado: 05 Set 2022 00:46
por Linguagemclipper
Prezados,

Estou tentando usar um webservice do TCU que me dá uma consulta consolidada de Pessoa Jurídica, mas dá erro logo na conversão do JSON para HASH.
Esse JSON contém um PDF dentro e o que me interessa é esse PDF gerado pela consulta.
Vejamos:
Consulta consolidada
GET https://certidoes-apf.apps.tcu.gov.br/a ... certidoes/{cnpj}?seEmitirPDF=(true|false)
A estrutura da resposta seria essa:
Response Class (Status 200)

application/json;charset=UTF-8
{
"razaoSocial":"string",
"nomeFantasia":string,
"cnpj":"string",
"uf":string,
"certidoes": [
{
"emissor":"TCU",
"tipo":"string",
"dataHoraEmissao":"13/04/2018 16:38",
"descricao":"string",
"situacao":"string",
"observacao":"string"
}
],
"certidaoPDF":"application/pdf"
}
Link do webservice: https://portal.tcu.gov.br/webservices-tcu/

Daí eu fiz esse teste:

Código: Selecionar todos

FUNCTION CEIS()
SAVE SCREEN TO cTEL6
cCOR6 := SETCOLOR()
MSGRODA("Informe o CNPJ para fazer a pesquisa consolidada de Pessoa Jurídica do TCU", "W+/BG")
TRJANELA(19,20,21,50,"GR+/R", "CONSULTA CONSOLIDADA PJ", .T.)
cCNPJ := SPACE(14)
@ 20,26 GET cCNPJ PICTURE "@R 99.999.999/9999-99" VALID CGC(cCNPJ)
READ
IF LASTKEY()#27
	// DEFINE VARIÁVEL DO TIPO HASH VAZIA
	hCNPJ := HASH()

	// Cria um objeto para requisicao HTTP
	http := CreateObject("MSXML2.ServerXMLHTTP")
	http:Open("GET", "https://certidoes-apf.apps.tcu.gov.br/api/rest/publico/certidoes/"+cCNPJ+"?seEmitirPDF=true", .F.)

        // http:SetRequestHeader( "Content-Type","application/json")
	http:SetRequestHeader( "Content-Type","application/pdf")

	// Envia parâmetros e aguarda a resposta
	MSGRODA("Buscando dados do CNPJ " + TRANSFORM(cCNPJ, "@R 99.999.999/9999-99") + ", aguarde...", "W+/BG")
	http:send()

	// CAPTA RESPOSTA
	JSONCNPJ := http:responseText

	fCERTIDAO := "CEIS"+cCNPJ+".PDF" // NOME DO PDF COM A CONSULTA
	IF FILE(fCERTIDAO)
		DELETEFILE(fCERTIDAO)
	ENDIF

	nFileHandle := FCreate(fCERTIDAO)
	FWRITE(nFileHandle, JSONCNPJ)
	FCLOSE(nFileHandle)
	
	/*
	// CONVERTE JSON PARA HASH
	hCNPJ := JSontoHash(JSONCNPJ) // DÁ ERRO AQUI
	? hCNPJ["razaoSocial"]
	? hCNPJ["nomeFantasia"]	
	nFileHandle := FCreate(fCERTIDAO)
	FWRITE(nFileHandle, hCNPJ["certidaoPDF"])
	FCLOSE(nFileHandle)
	*/
ENDIF
RESTORE SCREEN FROM cTEL6
SETCOLOR(cCOR6)
RETURN

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
Essa função JSontoHash() funciona legal no webservice do CNPJÁ, mas nesse aí que tem um arquivo PDF no meio dá erro.
Ví alguma coisa com AttachFile, mas seria um objeto de email. Acho que primeiro teria que resolver essa conversão do JSON para Hash e depois salvar o valor do hash "certidaoPDF" em arquivo... não sei como.
Agradeço a todos que puderem ajudar.

JSON para HASH com PDF

Enviado: 05 Set 2022 02:44
por alxsts
Olá!

Por que não utiliza os recursos naturais da linguagem Harbour ao invés desta função JSontoHash?

Código: Selecionar todos

      LOCAL hRet
      hb_jsonDecode( JSONCNPJ, @hRet )

      cPDF := hRet["certidaoPDF"]


      fCERTIDAO := "CEIS"+cCNPJ+".PDF" // NOME DO PDF COM A CONSULTA
      IF FILE(fCERTIDAO)
         DELETEFILE(fCERTIDAO)
      ENDIF
   
      nFileHandle := FCreate(fCERTIDAO)
      FWRITE(nFileHandle, cPdf )
      FCLOSE(nFileHandle)
   
Da forma acima, traz todas as informações. Teria que instanciar uma classe de PDF e jogar pra dentro dela o resultado de cPDF := hRet["certidaoPDF"] ...

JSON para HASH com PDF

Enviado: 05 Set 2022 10:07
por Linguagemclipper
Porque eu uso o xHarbour v1.2.1. Não tem essa função nele.
Ví alguma coisa sobre BASE64ENCODE usado pra transportar aquivo PDF pela web. Achei que se conseguisse o hash era só salvar o BASE64DECODE dele com um nome de arquivo PDF e pronto.
Todavia, não consigo transformar esse JSON para HASH.

JSON para HASH com PDF

Enviado: 05 Set 2022 12:13
por alxsts
Olá!

Entendi. Este serviço não tem opção de retorno em formato XML?

JSON para HASH com PDF

Enviado: 05 Set 2022 14:57
por Paredes01
Hola
Xharbour si tiene esas funciones

HB_Base64Encode()
Encodes a character string base 64.
Syntax
HB_Base64Encode( <cString>, <nBytes> ) --> cBase64
Arguments
<cString>
This is a character string to encode with the base 64 algorithm.
<nBytes>
The number of bytes to encode from <cString> must be passed as second parameter. Use the expression Len(<cString>) to encode the entire string.
Return
The function returns a base 64 encoded character string.

Description
HB_Base64Encode()
uses the Base 64 algorithm for encoding a character string. The encoded string is about one third larger than the original string, but contains only alphanumeric characters.
Pass the resulting string to function HB_Base64Decode() to obtain the original data.
Info
See also: HB_Base64Decode(), HB_Base64DecodeFile(), HB_Base64EncodeFile()
Category: Encoding/Decoding, xHarbour extensions
Source: tip\encoding\Base64.c
LIB: xhb.lib
DLL: xhbdll.dll

Example
// The example outlines base 64 encoding and decoding.
PROCEDURE Main
LOCAL cString := "xHarbour"
LOCAL cBase64 := HB_Base64Encode( cString, Len(cString ) )
? cBase64
// result: eEhhcmJvdXI==
? HB_Base64Decode( cBase64 )
// result: xHarbour
RETURN

JSON para HASH com PDF

Enviado: 05 Set 2022 15:00
por Paredes01
Hola
También cuenta con:
hb_jsonEncode
hb_jsonDecode

Saludos!!

JSON para HASH com PDF

Enviado: 05 Set 2022 15:17
por Linguagemclipper
Paredes01 escreveu:Hola
También cuenta con:
hb_jsonEncode
hb_jsonDecode

Saludos!!
Hola! La versión del xHarbour que tengo no hay!
Estoy usando la version 1.2.1
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: Unresolved external '_HB_FUN_HB_JSONDECODE' referenced from E:\PROGRAMAS\CONTROLI\OBJ\EXTRAS.OBJ
Error: Unresolved external '_HB_FUN_HB_BASE64DECODE' referenced from E:\PROGRAMAS\CONTROLI\OBJ\EXTRAS.OBJ
Necesito de estas libs.

JSON para HASH com PDF

Enviado: 05 Set 2022 15:22
por Linguagemclipper
Pessoal,

Só vou conseguir resolver a parada com estas funções mesmo: HB_JSONDECODE() e HB_BASE64DECODE().
Fiz um teste aqui com o Harbour 3.2 e deu certo! O PDF foi salvo bonitinho!

Código: Selecionar todos

	
        cCNPJ := SPACE(14)
        @ 20,26 GET cCNPJ PICTURE "@R 99.999.999/9999-99" VALID CGC(cCNPJ)
        READ

        // DEFINE VARIÁVEL DO TIPO HASH VAZIA
	hCNPJ := HASH()

	// Cria um objeto para requisicao HTTP	
	http := CreateObject("MSXML2.ServerXMLHTTP")
	http:Open("GET", "https://certidoes-apf.apps.tcu.gov.br/api/rest/publico/certidoes/"+cCNPJ+"?seEmitirPDF=true", .F.)

	http:SetRequestHeader( "Content-Type", "application/json; charset=utf-8")

	// Envia parâmetros e aguarda a resposta
	MSGRODA("Buscando dados do CNPJ " + TRANSFORM(cCNPJ, "@R 99.999.999/9999-99") + ", aguarde...", "W+/BG")
	http:send()

	// CAPTA RESPOSTA
	JSONCNPJ := http:responseText

	// APAGA ÚLTIMO PDF
	fCERTIDAO := "CEIS"+cCNPJ+".PDF"
	IF FILE(fCERTIDAO)
		DELETEFILE(fCERTIDAO)
	ENDIF
	
	// CONVERTE JSON PARA HASH
	hb_jsonDecode( JSONCNPJ, @hCNPJ )
	
	// SALVA PDF
	nFileHandle := FCreate(fCERTIDAO)
	FWRITE(nFileHandle, HB_Base64Decode( hCNPJ["certidaoPDF"] ))
	FCLOSE(nFileHandle)

JSON para HASH com PDF

Enviado: 05 Set 2022 19:06
por alxsts
Olá!
Paredes01 escreveu:Hola
También cuenta con:
hb_jsonEncode
hb_jsonDecode
Segundo o changelog do xHarbour, estas funções foram incorporadas em 24/02/2011, "emprestadas" do Harbour... veja neste tópico

Sendo assim, se você utiliza xHarbour 1.2X, deveria ter na tua versão...

JSON para HASH com PDF

Enviado: 05 Set 2022 19:08
por alxsts
Olá!

Talvez estejam com outro nome (sem o prefixo hb_) mas, não foi isto que disse o Paredes01 acima...

JSON para HASH com PDF

Enviado: 05 Set 2022 19:37
por JoséQuintas
Ele já comentou em outro post que não troca a versão do XHarbour, porque dá problema em certas funções, que NÃO são do XHarbour.
E as funções json só tem na versão mais nova.

JSON para HASH com PDF

Enviado: 16 Set 2022 12:30
por Linguagemclipper
Verdade, Quintas, mas já descobrí o que é, saiu uma nova compilação do xhb 1.2.3 e deu erro aqui então percebí que devo usar o BCC58 com ele, mas estava usando o BCC55. Portanto, ao usar o compilador C correto, BCC58, compilou tudo direitinho, inclusive minha função de relatório funcionou corretamente. Tem o HB_JSONDECODE() e HB_BASE64DECODE() que preciso, mas a listagem do diretório FTP não sai com as datas dos arquivos e não conseguí compilar a partir dos fontes essa versão 1.2.3 que está no xharbour.org porque só tem os programas em C, não tem os demais para compilar. Talvez, tenha algum caminho aí que não sei qual é... muito estranho disponibilizar só os fontes em C sem dar condições de alterar e recompilar. Eu poderia corrigir direto no fonte source\tip\ftpcln.prg se tivesse esse arquivo lá.

JSON para HASH com PDF

Enviado: 16 Set 2022 13:14
por JoséQuintas
Linguagemclipper escreveu: não conseguí compilar a partir dos fontes essa versão 1.2.3 que está no xharbour.org porque só tem os programas em C, não tem os demais para compilar. Talvez, tenha algum caminho aí que não sei qual é... muito estranho disponibilizar só os fontes em C sem dar condições de alterar e recompilar. Eu poderia corrigir direto no fonte source\tip\ftpcln.prg se tivesse esse arquivo lá.
O phoda é que o xHarbour separa tudo.
Tem os fontes no source-forge, mas se não me engano, é só do xHarbour sem nenhuma contribuição.

NÃO sei como gera o XHarbour a partir dos fontes, mas....
Com toda certeza, depois gerando partes usando HBMK2, vai ser de muita ajuda, se depois usar só HBMK2.
Vai ter todas as vantagens do Harbour/HBMK2 encima do XHarbour.

Vai ser difícil alguém fazer isso, já que a maioria não enxerga as vantagens.
E olhe que não conheço nem metade dos recursos....
Mas eles vão longe.

JSON para HASH com PDF

Enviado: 16 Set 2022 14:13
por JoséQuintas
xhb.png
Não uso XHarbour.
Mas tem que baixar os dois fontes, um é XHarbour e outro são as CONTRIB.

JSON para HASH com PDF

Enviado: 16 Set 2022 19:47
por Linguagemclipper
Eu baixei os 2! Só tem arquivos C, não tem PRG nem BAT.
Não sei como compilar desse jeito.
Eu chamo um BAT que usa o BCC58 que aí não tem.
Esses fontes eu sei que não é só C porque tem PRG também no meio além dos arquivos de cabeçalho tanto do C (.h) quanto do xbase (.CH) -os includes.
Para quem interessar, o passo-a-passo para compilar o xhb dos fontes: https://linguagemclipper.com.br/dicas/xharbour/cvs

Quintas, saiu o HMG 3.5 ontem, acabei de baixar aqui para testar com ele: http://www.hmgforum.com/app.php/download
Meu Kaspersky acusou: VHO:Packed.Win32.Convagent.gen. Falso positivo.
Instalei, mas não entendí nada porque o IDE_ANSI.EXE diz ter a mesma versão 1.2a do anterior e nele também diz HMG 3.4.4 Stable... ora, não é o 3.5? Entendí nada.
Achei estranho também que na pasta I:\HMG35\HARBOUR\BIN onde está o harbour.exe aponta a versão Harbour 3.2.0dev (r2011030937) do Harbour... pensei que fosse 3.5, mas na pasta do HMG 3.4.3 que tenho aqui é 3.2 também, pensei que fosse Harbour 3.4.
Estou confuso...
Harbour 3.4 tem nada a ver com o HMG, correto?
Acabei de ver aqui e baixar, mas deu isso:
hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s):
HB_OEMTOANSI(), HB_SENDMAIL(), HB_ANSITOOEM()

Já dei meio caminho aqui: viewtopic.php?f=4&t=15648

Estou matando assim:

Código: Selecionar todos

#ifndef __XHARBOUR
	#translate HB_OEMTOANSI(<msg>) => Win_OemToAnsi(<msg>)
#endif
Fiz uma função nula do HB_SENDMAIL() só pra compilar com esse Harbour 3.4, mas deu a mesma falha do HB 3.2 e do xHb 1.2.3 na listagem de diretórios FTP...