Crear Archivo Json y Enviarlo vía POST

Crear Archivo Json y Enviarlo vía POST

Postby leandro » Mon Apr 22, 2019 4:15 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby karinha » Mon Apr 22, 2019 7:47 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7215
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Crear Archivo Json y Enviarlo vía POST

Postby russimicro » Mon Apr 22, 2019 10:20 pm

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
russimicro
 
Posts: 225
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby leandro » Wed May 08, 2019 8:32 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby cnavarro » Wed May 08, 2019 8:46 pm

Leandro, prueba asi

Code: Select all  Expand view

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
cnavarro
 
Posts: 6500
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Crear Archivo Json y Enviarlo vía POST

Postby leandro » Wed May 08, 2019 9:29 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby russimicro » Wed May 08, 2019 9:59 pm

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

russimicro
 
Posts: 225
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby leandro » Wed May 08, 2019 10:59 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby cwanderlei_cardoso » Fri Jun 07, 2019 5:39 pm

como faço para enviar um arquivo .gz no lugar do arquivo json?
cwanderlei_cardoso
 
Posts: 5
Joined: Mon May 20, 2019 3:49 pm

Re: Crear Archivo Json y Enviarlo vía POST

Postby leandro » Fri Jun 07, 2019 7:38 pm

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

[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
User avatar
leandro
 
Posts: 1481
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Crear Archivo Json y Enviarlo vía POST

Postby landaga » Wed May 12, 2021 1:27 pm

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
landaga
 
Posts: 20
Joined: Fri Sep 12, 2008 2:56 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 82 guests