Crear Archivo Json y Enviarlo vía POST

Post Reply
User avatar
leandro
Posts: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
karinha
Posts: 7907
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil
Been thanked: 3 times
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post by karinha »

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
russimicro
Posts: 263
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: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
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 | Expand


#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


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


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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
User avatar
cnavarro
Posts: 6555
Joined: Wed Feb 15, 2012 8:25 pm
Location: España
Been thanked: 3 times

Re: Crear Archivo Json y Enviarlo vía POST

Post by cnavarro »

Leandro, prueba asi

Code: Select all | Expand


respuesta := hb_jsonDecode( StrTran( response, '"', "" ) )   // Chr( 34 )
 
Cristobal Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
User avatar
leandro
Posts: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
russimicro
Posts: 263
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: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post by leandro »

Excelente JOHNSON

Muchisimas gracias.... :D

Code: Select all | Expand


    response:=ohttp:responseText
   
    aHasRes := hash()
    hb_jsondecode(response ,@aHasRes) //Parse JSON to hash
   
    elemento := aHasRes["error"]
    ?valtype(elemento)
 
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
cwanderlei_cardoso
Posts: 5
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: 1719
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Has thanked: 11 times
Been thanked: 3 times
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 | Expand


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

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 AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 24.09 ] [ xHarbour 64 bits) ]
landaga
Posts: 20
Joined: Fri Sep 12, 2008 2:56 pm

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
User avatar
PAUL SIMM
Posts: 86
Joined: Fri Oct 07, 2005 7:59 am
Location: Madrid, Spain
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
Regards/Saludos
Paul

paul@pes-systems.net
User avatar
PAUL SIMM
Posts: 86
Joined: Fri Oct 07, 2005 7:59 am
Location: Madrid, Spain
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post 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
Regards/Saludos
Paul

paul@pes-systems.net
User avatar
Antonio Linares
Site Admin
Posts: 42386
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 8 times
Been thanked: 15 times
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post by Antonio Linares »

Estimado Paul,

tip.lib y xharbour.lib
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Enrico Maria Giordano
Posts: 8734
Joined: Thu Oct 06, 2005 8:17 pm
Location: Roma - Italia
Been thanked: 1 time
Contact:

Re: Crear Archivo Json y Enviarlo vía POST

Post by Enrico Maria Giordano »

Only tip.lib, not xharbour.lib (that is a non-existent lib).
Post Reply