Crear Archivo Json y Enviarlo vía POST

Post Reply
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Crear Archivo Json y Enviarlo vía POST

Post 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.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Crear Archivo Json y Enviarlo vía POST

Post by karinha »

João Santos - São Paulo - Brasil
russimicro
Posts: 179
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
Last edited by leandro on Wed May 08, 2019 11:02 pm, edited 2 times in total.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Crear Archivo Json y Enviarlo vía POST

Post by cnavarro »

Leandro, prueba asi

Code: Select all

respuesta := hb_jsonDecode( StrTran( response, '"', "" ) )   // Chr( 34 )
 
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post by leandro »

Cristobal gracias por responder...

Pero no funciono :cry: sigue igual.

Saludos
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
russimicro
Posts: 179
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post 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)
 
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
cwanderlei_cardoso
Posts: 3
Joined: Mon May 20, 2019 3:49 pm

Re: Crear Archivo Json y Enviarlo vía POST

Post by cwanderlei_cardoso »

como faço para enviar um arquivo .gz no lugar do arquivo json?
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
 
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
Post Reply