Page 1 of 2

Crear Archivo Json y Enviarlo vía POST

PostPosted: Mon Apr 22, 2019 4:15 pm
by leandro
Buenos días para todos,

Como dice el encabezado, requiero crear un archivo JSON y luego enviarlo a una url vía POST. Estuve buscando en el foro, pero no encuentro un ejemplo claro sobre como hacerlo.

Por ahí encontré que existen unas funciones de harbour que permiten hacer lo que necesito, el problema es que yo uso xharbour. Alguien me puede orientar en este tema? Se puede hacer lo que requiero con xharbour?.

De antemano muchas gracias.

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Mon Apr 22, 2019 7:47 pm
by karinha

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Mon Apr 22, 2019 10:20 pm
by russimicro
Buena tarde

function envia_json(user,pass,cJsoRes,vDatCar)

local ahashImpuestos := ahashEncabezado := hash()
local mImpuestos := {},doc ,Ctext ,cJson, response
local cBas64 := hb_base64encode(user+":"+pass,len(user+":"+pass))


try
// ejemplo reducido de json
ahashImpuestos["Nvimp_desc"] := ALLTRIM(vDatCar[1])
ahashImpuestos["Nvimp_cdia"] := ALLTRIM(vDatCar[2])
ahashImpuestos["Nvimp_porc"] := ALLTRIM(vDatCar[3])
ahashImpuestos["Nvimp_valo"] := ALLTRIM(vDatCar[4])
ahashImpuestos["Nvimp_base"] := ALLTRIM(vDatCar[5])
ahashImpuestos["Nvimp_oper"] := "S"
AADD(mImpuestos,ahashImpuestos)

ahashEncabezado["lImpuestos"] := mImpuestos

cJson := hb_jsonEncode(ahashEncabezado,.T.)

doc := CreateObject( "MSXML2.DOMDocument" )
ohttp := CreateObject("MSXML2.XMLHTTP" )
ohttp:Open( "POST" ," http://proveedor.com.co/api/facfacturas",.F.)
oHttp:SetRequestHeader("Host", "localhost")
oHttp:SetRequestHeader("cache-control", "no-cache")
oHttp:SetRequestHeader("Connection", "Keep-Alive")
ohttp:SetRequestHeader("content-type", "application/json" )
ohttp:SetRequestHeader("Authorization", "Basic "+cBas64 )

Ctext:= cJson

TRY
ohttp:Send( cText )
CATCH
alerta("No Se Pudo Enviar Documento JSON","Intente Nuevamente")
END

response := ohttp:responseText

//Memowrit("RESPUESTA.TXT",Response)

cJsoRes := response

return



JOHNSON RUSSI TELLO

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 08, 2019 8:32 pm
by leandro
Buenas tardes

JOHNSON, muchas gracias, el dato que me diste me sirvió de base para avanzar. Al final e investigando un poco el foro, llegue a esto:

Code: Select all  Expand view

#include "fivewin.ch"

function Main()

    local user := "usuario-codificado"
    local pass := "clave-codificada"
    local cBas64 := hb_base64encode(user+":"+pass,len(user+":"+pass))
   
    local encabezado := {=>}
    local sucursal := {=>}
    local tercero := {=>}
    local imp_1 := {=>}
    local imp_2 := {=>}
    local detal_1 := {=>}
    local detal_2 := {=>}
    local detal_3 := {=>}
    local impuestos := {}
    local detalle := {}
    local documento := {=>}
    local final := {=>}
    local enviar
    local respuesta

    //Encabezado factura
    encabezado["codmoneda"] = "COP"
    encabezado["comentarios"] = ""
    encabezado["emisor"] = "830106032"
    encabezado["factortrm"] =  0
    encabezado["fecha"] =  "2019-05-08"
    encabezado["fvence"] =  "2019-05-08"
    encabezado["idsuc"] =  1
    encabezado["idvendedor"] =  0
    encabezado["iva"] =  19000
    encabezado["nit"] =  123456789
    encabezado["numero"] =  993005011
    encabezado["ordencompra"] =  ""
    encabezado["prefijo"] =  "FVE"
    encabezado["subtotal"] =  200000
    encabezado["sucursal"] =  0
    encabezado["total"] =  219000
    encabezado["usuario"] =  ""
    encabezado["totalDet"] =  3
    encabezado["totalImp"] =  2 
   
    //Datos empresa
    sucursal["ciudad"] =  "BOGOTA D.C."
    sucursal["codcliente"] =  ""
    sucursal["departamento"] =  "BOGOTA D.C."
    sucursal["direccion1"] =  "CALLE 111 # 23 - 55"
    sucursal["dpto"] =  "11"
    sucursal["email"] =  ""
    sucursal["emailfe"] =  "leandroalfonso111@hotmail.com"
    sucursal["idsuc"] =  0
    sucursal["idvendedor"] =  0
    sucursal["movil"] =  "1245678"
    sucursal["mun"] =  "001"
    sucursal["razonsocial"] =  "LEANDRO AREVALO"
    sucursal["telefono1"] =  "2100518"
    sucursal["telefono2"] =  "" 
   
    //Datos tercero o cliente
    tercero["apl2"] = ""
    tercero["apli1"] = "AREVALO"
    tercero["comentarios"] = ""
    tercero["dv"] = ""
    tercero["identificacion"] = 123456789
    tercero["idtipoempresa"] = 4
    tercero["nom1"] = "LEANDRO"
    tercero["nom2"] = ""
    tercero["razonsocial"] = "AREVALO"
    tercero["tdoc"] =  13
    tercero["tipopersona"] = "N"   
   
    //impuestos en variables
    imp_1["base_calculo"] = 100000
    imp_1["porciva"] = 19
    imp_1["valor"] = 19000

    imp_2["base_calculo"] = 100000
    imp_2["porciva"] = 0
    imp_2["valor"] = 0

    AADD(impuestos,imp_1)
    AADD(impuestos,imp_2)

    //Listado de articulos a facturar
    //articulo 1
    detal_1["adicional"] = "linea1"
    detal_1["cantidad"] = 10
    detal_1["idproducto"] = "01"
    detal_1["idunidad"] = "Und"
    detal_1["iva"] = 19000
    detal_1["ivausd"] = 0
    detal_1["nombreproducto"] = "Producto1"
    detal_1["operacion"] = "SA"
    detal_1["porcdcto"] = 0
    detal_1["porciva"] = 19
    detal_1["pos"] = 1
    detal_1["precio"] = 10000
    detal_1["preciousd"] = 0
    detal_1["subtotal"] = 100000
    detal_1["subtotalusd"] = 0

    //articulo 2
    detal_2["adicional"] = "linea2"
    detal_2["cantidad"] = 1
    detal_2["idproducto"] = "02"
    detal_2["idunidad"] = "EA"
    detal_2["iva"] = 0
    detal_2["ivausd"] = 0
    detal_2["nombreproducto"] = "Producto2"
    detal_2["operacion"] = "SA"
    detal_2["porcdcto"] = 0
    detal_2["porciva"] = 0
    detal_2["pos"] = 2
    detal_2["precio"] = 60000
    detal_2["preciousd"] = 0
    detal_2["subtotal"] = 60000
    detal_2["subtotalusd"] = 0

    //articulo 3
    detal_3["adicional"] = "linea3"
    detal_3["cantidad"] = 2
    detal_3["idproducto"] = "03"
    detal_3["idunidad"] = "ME"
    detal_3["iva"] = 0
    detal_3["ivausd"] = 0
    detal_3["nombreproducto"] = "Producto3"
    detal_3["operacion"] = "SA"
    detal_3["porcdcto"] = 0
    detal_3["porciva"] = 0
    detal_3["pos"] = 3
    detal_3["precio"] = 20000
    detal_3["preciousd"] = 0
    detal_3["subtotal"] = 40000
    detal_3["subtotalusd"] = 0

    AADD(detalle , detal_1)
    AADD(detalle , detal_2)
    AADD(detalle , detal_3)

    //agregamos la informacion al json documento
    documento["detalle"] = detalle
    documento["encabezado"] = encabezado
    documento["sucursal"] = sucursal
    documento["tercero"] = tercero
    documento["impuesto"] = impuestos
   
    //creamos el json con el documento final
    final["documento"] = documento
        enviar := hb_jsonEncode( final )

    doc := CreateObject( "MSXML2.DOMDocument" )
    ohttp := CreateObject( "MSXML2.XMLHTTP" )
    ohttp:Open( "POST" ,"https://ws.proveedor-prueba.co/Factura/nrodocumento",.F.)
    oHttp:SetRequestHeader("cache-control", "no-cache")
    ohttp:SetRequestHeader("content-type", "application/json" )
    ohttp:SetRequestHeader("authorization", "Basic "+cBas64 )
    TRY
      ohttp:Send( enviar )
    CATCH
    msginfo("No Se Pudo Enviar Documento JSON","Intente Nuevamente")
    return .t.
    END
    response:=ohttp:responseText
    ?response

return nil
 


Ahora me surge otra duda,

El WS en la variable response me devuelve una cadena de texto asi:
Code: Select all  Expand view

"{'qrdata':'NumFac: 993005004\nFecFac: 20190508141241\nNitFac: 830106032\nDocAdq: 79760202\nValFac: 200000.00\nValIva: 0.00\nValOtroImp: 0.00\nValFacIm: 219000.00\nCUFE: e872704393ec005f7187553f34a6',
'xml':'PD94lByaWNlPjwvZmU6SW52b2ljZUxpbmU+PC9mZTpJbnZvaWNlPg==',
'clavtec':'dd85db55545bd6566f36b0fd3be9fd8555c36e',
'id':38390,
'error':'',
'cufe':'e872704393ec005f7187553f34a6'}"

 


Pero lo que necesito es convertirla en un objeto JSON, intente de la siguiente manera pero me devuelve un número
Code: Select all  Expand view

local respuesta := {=>}
....

...
respuesta := hb_jsonDecode( response)
?respuesta  //29
 

De antemano gracias

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 08, 2019 8:46 pm
by cnavarro
Leandro, prueba asi

Code: Select all  Expand view

respuesta := hb_jsonDecode( StrTran( response, '"', "" ) )   // Chr( 34 )
 

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 08, 2019 9:29 pm
by leandro
Cristobal gracias por responder...

Pero no funciono :cry: sigue igual.

Saludos

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 08, 2019 9:59 pm
by russimicro
aHasRes := hash()
hb_jsondecode(respuesta ,@aHasRes) //Parse JSON to hash

//MEMOEDIT(respuesta ) // ver estructura del json retornado

IF aHasRes["Result"] == 0
cNuCufe := aHasRes["Cufe"]
cDatoQr := "0- "+aHasRes["QrCode"]
cNorIde := aHasRes["Id"]
SET DEVICE TO SCREEN
alert("Proceso terminó con éxito. Archivo generado : ")

ELSEIF aHasRes["Result"] == 1
cDatoQr := "1- "+aHasRes["Description"]
mymen("Error. Enviando factura electrónica : "+cDatoQr)
SET DEVICE TO SCREEN
ENDIF


Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 08, 2019 10:59 pm
by leandro
Excelente JOHNSON

Muchisimas gracias.... :D

Code: Select all  Expand view

    response:=ohttp:responseText
   
    aHasRes := hash()
    hb_jsondecode(response ,@aHasRes) //Parse JSON to hash
   
    elemento := aHasRes["error"]
    ?valtype(elemento)
 

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Fri Jun 07, 2019 5:39 pm
by cwanderlei_cardoso
como faço para enviar um arquivo .gz no lugar do arquivo json?

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Fri Jun 07, 2019 7:38 pm
by leandro
se me ocurre que lo puedes convertir en base64, para luego ser enviado...

Code: Select all  Expand view

//----------------------------------------------------------------------------//

function ConverBase64()

    local user := "myUser"
    local pass := "myPass"
    local cBas64 := hb_base64encode(user+":"+pass,len(user+":"+pass))
   
    local enviar
    local respuesta
    local aHasRes
    local elemento
    Local cText

    //leemos el archivo.gz y lo convertimos base 64
    fMimeEnc( "c:\archivo.gz", "c:\archivo")
    //colocamos contenido en variable
    cText := MemoRead( "c:\archivo" )

   
    ohttp := CreateObject( "MSXML2.XMLHTTP" )
    ohttp:Open( "POST" ,"https://myurl",.F.)
    oHttp:SetRequestHeader("cache-control", "no-cache")
    ohttp:SetRequestHeader("content-type", "application/json" )
    ohttp:SetRequestHeader("authorization", "Basic "+cBas64 )
    TRY
      ohttp:Send( cText )
    CATCH
        msginfo("No Se Pudo Enviar archivo","Nuevamente")
        return .t.
    END
    response:=ohttp:responseText

    aHasRes := hash()
    hb_jsondecode(response ,@aHasRes) //Parse JSON to hash
    xBrowse(aHasRes)

return nil
 

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Wed May 12, 2021 1:27 pm
by landaga
cwanderlei_cardoso wrote:como faço para enviar um arquivo .gz no lugar do arquivo json?

Conseguiste enviar el archivo .gz vía POST?
Tengo el mismo problema y la solución de pasarlo a base64 no me sirve, me exigen que vaya en formato gzip

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Sun May 05, 2024 10:16 am
by PAUL SIMM
Que libereias tengo que enlazar con XHARBOUR y FiveWin for xHarbour 64 parar incluir estos funciones?

Error: Unresolved external '_HB_FUN_HB_BASE64ENCODE' referenced from C:\FIVEWIN21\FWH\SAMPLES\APP1API.OBJ
Error: Unresolved external '_HB_FUN_HB_JSONENCODE' referenced from C:\FIVEWIN21\FWH\SAMPLES\APP1API.OBJ

Saludos
Paul

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Sun May 05, 2024 10:16 am
by PAUL SIMM
Que libereias tengo que enlazar con XHARBOUR y FiveWin for xHarbour 64 parar incluir estos funciones?

Error: Unresolved external '_HB_FUN_HB_BASE64ENCODE' referenced from C:\FIVEWIN21\FWH\SAMPLES\APP1API.OBJ
Error: Unresolved external '_HB_FUN_HB_JSONENCODE' referenced from C:\FIVEWIN21\FWH\SAMPLES\APP1API.OBJ

Saludos
Paul

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Sun May 05, 2024 2:39 pm
by Antonio Linares
Estimado Paul,

tip.lib y xharbour.lib

Re: Crear Archivo Json y Enviarlo vía POST

PostPosted: Sun May 05, 2024 2:46 pm
by Enrico Maria Giordano
Only tip.lib, not xharbour.lib (that is a non-existent lib).