Page 1 of 1

Crear Archivo Json y Enviarlo vía POST

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

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

Re: Crear Archivo Json y Enviarlo vía POST

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

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

#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

"{'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

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

...
respuesta := hb_jsonDecode( response)
?respuesta  //29
 
De antemano gracias

Re: Crear Archivo Json y Enviarlo vía POST

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

Code: Select all

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

Re: Crear Archivo Json y Enviarlo vía POST

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

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

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

Muchisimas gracias.... :D

Code: Select all

    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

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

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

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

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