Webservices

Post Reply
mterraz
Posts: 41
Joined: Mon Jun 10, 2013 1:21 pm

Webservices

Post by mterraz »

Estimados,
Estoy trabajando con webservices y tengo la siguiente inquietud al momento de utilizar los metodos POST y GET.

El web service esta alojado en esta URL
http://ws.medicamentosrothlin.com.ar/?f=ws

Para probar el servicio y depurar consultas se puede usar esta pagina:
http://ws.medicamentosrothlin.com.ar/test

El servicio espera dos parámetros, uno GET, siempre es el mismo f=ws, de modo que hay que llamar a la url de esta manera http://ws.medicamentosrothlin.com.ar/?f=ws
y el otro parámetro es POST, mensaje. El mensaje se envía en formato xml de acuerdo a la siguiente especificación:

EJEMPLO DE MENSAJE DE LLAMADA InteraccionFarmacologica (se puede colocar en la pagina de pruebas)

<?xml version="1.0" encoding="utf-8"?>
<Interdrugs>
<Login>
<Cliente>COLFARMRN</Cliente>
<Terminal>SISTEMAS</Terminal>
<Codigo>RNFM00001</Codigo>
<Clave>ZZZZ</Clave>
</Login>
<Transaccion>
<!--Se establece la funcion InteraccionFarmacologica para consultar interacciones entre medicamentos-->
<Operacion>InteraccionFarmacologica</Operacion>
<!--Se indica la version de la funcion que se esta llamando-->
<Version>1.0.1</Version>
<!--Define el formato de salida-->
<Salida>xml</Salida>
</Transaccion>
<Mensaje>
<Parametros>
<Diccionario>AlfaBeta</Diccionario>
<NRO_REG>35142</NRO_REG><!--IBUPIRAC 600 MG-->
<NRO_REG>12907</NRO_REG><!--ENALAPRIL RICHET-->
</Parametros>
</Mensaje>
</Interdrugs>

EJEMPLO XML de respuesta

<?xml version="1.0" encoding="utf-8"?>
<Interdrugs>
<Login>
<Cliente>COLFARMRN</Cliente>
<Terminal>SISTEMAS</Terminal>
<Codigo>RNFM00001</Codigo>
<Clave>ZZZZ</Clave>
<Ok>1</Ok>
</Login>
<Transaccion>
<!--Se establece la funcion InteraccionFarmacologica para consultar interacciones entre medicamentos-->
<Operacion>InteraccionFarmacologica</Operacion>
<!--Se indica la version de la funcion que se esta llamando-->
<Version>1.0.1</Version>
<!--Define el formato de salida-->
<Salida>xml</Salida>
</Transaccion>
<Mensaje>
<Parametros>
<Diccionario>AlfaBeta</Diccionario>
<NRO_REG>35142</NRO_REG><!--IBUPIRAC 600 MG-->
<NRO_REG>12907</NRO_REG><!--ENALAPRIL RICHET-->
</Parametros>
</Mensaje>
<Log/>
<MensajeRespuesta>
<Transaccion>
<!--Se indica la fecha y la hora en la que se proceso la consulta-->
<FechaHora>04/03/16 01:03:53</FechaHora>
<!--Se informa un identificador de la consulta para un posible seguimiento de errores-->
<Id>2645</Id>
</Transaccion>
<!-- En caso de generarse algun error en la consulta el mismo es devuelto de la siguiente manera:
<Errores>
<Error>
<Codigo>1001</Codigo>
<Descripcion>Mensaje xml mal formado. Opening and ending tag mismatch: Parametrosf line 18 and Parametros
</Descripcion>
</Error>
</Errores>
-->
<!--Respuesta de la funcion llamada (los elementos de salida pueden variar de acuerdo a la consulta,
eso se ira indicando a medida que las funciones se implementen)-->
<InteraccionFarmacologica>
<Observaciones>Interacciones encontradas: 1</Observaciones>
<Item>
<Nombre>Interaccion</Nombre>
<Valor>1</Valor>
<Droga1>IBUPROFENO</Droga1>
<Droga2>ENALAPRIL</Droga2>
<Medicamento1>IBUPIRAC 600 MG</Medicamento1>
<Medicamento2>ENALAPRIL RICHET</Medicamento2>
<Descripcion>
Los AINE pueden disminuir el efecto antihipertensivo y natriurético de los IECA,
el mecanismo puede implicar la atenuación de la efectividad de los agentes antihipertensivos
secundario a la interferencia con la producción de prostaglandinas vasodilatadoras y natriuréticas
que son estimuladas por los agentes antihipertensivos. Si bien no se conocen interacciones
farmacocinéticas significativas entre los AINE y los inhibidores de la ECA, la combinación
de los AINE y los inhibidores de la ECA pueden producir efectos secundarios tales como
bradicardia marcada debido a hiperpotasemia. Se debe monitorear la eficacia antihipertensiva
en especial en la insuficiencia renal, en pacientes ancianos, en pacientes deshidratados.
Cuando el uso concomitante es necesario, monitorear la eficacia antihipertensiva de los IECA
y la función renal periódicamente para detectar signos de insuficiencia renal. &#13;
</Descripcion>
</Item>
</InteraccionFarmacologica>
</MensajeRespuesta>
</Interdrugs>

/////////////////////////////////////////////////////////////////////////////////////////////////////

ESTE ES UN EJEMPLO DE MI FUNCION CONSULTAR() QUE NO OBTIENE LOS VALORES DE RESULTADO COMO EN EL EJEMPLO


/////////////////////////////////////////////////////////////////////////////////////////////////////

//.......................
FUNCTION Consultar()
//......................

local odoc,ohttp,cUrl,cXml

//..crea objeto XML
TRY
oHttp:=createobject( 'Microsoft.XMLHTTP')
CATCH
try
oHttp:=createobject( 'Microsoft.XMLHTTP')
catch
Alert('Error en la creacion del objeto Microsoft.XMLHTTP : ' + Ole2TxtError())
return .F.
end
END

//.. Creo Objeto XML
TRY
oDoc := CreateObject( 'MSXML2.DOMDocument' )
CATCH
try
oDoc := CreateObject( 'MSXML2.DOMDocument' )
catch
Alert('Error en la creacion del objeto MSXML2.DOMDocument : ' + Ole2TxtError())
return .F.
end
END

cUrl:="http://ws.medicamentosrothlin.com.ar/?f=ws"

cXml:=''
cXml+='<?xml version="1.0" encoding="utf-8"?>' + CRLF
cXml+='<Interdrugs>' + CRLF
cXml+='<Login>' + CRLF
cXml+=' <Cliente>COLFARMRN</Cliente>' + CRLF
cXml+=' <Terminal>SISTEMAS</Terminal>' + CRLF
cXml+=' <Codigo>RNFM00001</Codigo>' + CRLF
cXml+=' <Clave>ZZZZ</Clave>' + CRLF
cXml+='</Login>' + CRLF
cXml+=' <Transaccion>' + CRLF
cXml+=' <Operacion>InteraccionFarmacologica</Operacion>' + CRLF
cXml+=' <Version>1.0.1</Version>' + CRLF
cXml+=' <Salida>xml</Salida>' + CRLF
cXml+=' </Transaccion>' + CRLF
cXml+=' <Mensaje>' + CRLF
cXml+=' <Parametros>' + CRLF
cXml+=' <Diccionario>AlfaBeta</Diccionario>' + CRLF
cXml+=' <NRO_REG>35142</NRO_REG>' + CRLF
cXml+=' <NRO_REG>12907</NRO_REG>' + CRLF
cXml+=' </Parametros>' + CRLF
cXml+=' </Mensaje>' + CRLF
cXml+='</Interdrugs>' + CRLF

PREGUNTA : Como debería hacer para que GET y POST funcionen correctamente y obtener una respuesta del webservice como la del ejemplo...??
///......................

oHttp:Open( 'POST' , cUrl , .F. )
oDoc:LoadXML( cXml ) //carga el documento a xml
oHttp:send(oDoc:xml) // envio xml
cRespuesta:= oHttp:responseText
? cRespuesta
//.....................

retu .t.

Muchas gracias,
Saludos Mariano
Last edited by mterraz on Mon Apr 25, 2016 1:30 pm, edited 1 time in total.
mterraz
Posts: 41
Joined: Mon Jun 10, 2013 1:21 pm

Re: Webservices

Post by mterraz »

ESTE ES CODIGO FUNCIONANDO CON WEBSERVICE

///////////////////////////////////////
FUNCTION Main(cDatos)
///////////////////////////////////////

local cNew:='',x,lOk:=.T.,curl
local cToken:=";",cProd,cProd2,cprod3

aProd:={}

if( empty(cDatos) .OR. cDatos=NIL )
RETU .T.
QUIT
endif

TRY
oHttp:= CreateObject( 'MSXML2.XMLHTTP')
CATCH
MsgInfo("Error al crear el objeto HTTP")
retu .t.
END

x:=1

WHILE .T.

cNew:=substr( cDatos,1,at('<END>',cDatos)+4 )

cProd := strtoken(cNew,1,cToken)
cProd2 := strtoken(cNew,2,cToken)
cProd3 := strtoken(cNew,3,cToken)

Aadd(aProd,cProd)
Aadd(aProd,cProd2)
Aadd(aProd,cProd3)

cDatos:= substr(cDatos,at('<END>',cDatos)+5)

if( at('<END>',cDatos) = 0)
exit
endif
x+=1
ENDDO

cXml:='mensaje=<?xml version="1.0" encoding="utf-8"?>' + CRLF
cXml+='<Interdrugs>' + CRLF
cXml+='<Login>' + CRLF
cXml+=' <Cliente>COLFARMRN</Cliente>' + CRLF
cXml+=' <Terminal>SISTEMAS</Terminal>' + CRLF
cXml+=' <Codigo>RNFM00001</Codigo>' + CRLF
cXml+=' <Clave>ZZZ</Clave>' + CRLF
cXml+='</Login>' + CRLF
cXml+=' <Transaccion>' + CRLF
cXml+=' <Operacion>InteraccionFarmacologica</Operacion>' + CRLF
cXml+=' <Version>1.0.1</Version>' + CRLF
cXml+=' <Salida>xml</Salida>' + CRLF
cXml+=' </Transaccion>' + CRLF
cXml+=' <Mensaje>' + CRLF
cXml+=' <Parametros>' + CRLF
cXml+=' <Diccionario>AlfaBeta</Diccionario>' + CRLF

for x:=1 to Len(aProd)
cXml+=' <NRO_REG>'+cvaltochar(aProd[x])+'</NRO_REG>' + CRLF
next

cXml+=' </Parametros>' + CRLF
cXml+=' </Mensaje>' + CRLF
cXml+='</Interdrugs>'

Memowrit('SendVentasCli_Req.xml',cXml)

cUrl:="http://ws.medicamentosrothlin.com.ar/?f=ws"

TRY
oHttp:Open( 'POST' , "http://ws.medicamentosrothlin.com.ar/?f=ws" ,.F. )
CATCH
MsgInfo("Error al conectarse con el WebService!")
END

oHttp:setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
oHttp:SetRequestHeader( 'Connection:', 'Keep-Alive' )
oHttp:SetRequestHeader( 'Content-length: ', len( cXml ) )

TRY
oHttp:send(cXml) // envia al WS
CATCH
MsgInfo("Error al enviar los productos al WebService!")
END

cRespuesta:= oHttp:responseText

Memowrit( 'SendVentasCli_Res.xml',cRespuesta)

oHttp:=NIL

RETU .T.


Saludos espero les sea de utilidad
Mariano
Last edited by mterraz on Mon Apr 25, 2016 1:30 pm, edited 1 time in total.
horacio
Posts: 1270
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Webservices

Post by horacio »

Mariano, que resultados obtienes de la consulta ?

Saludos
mterraz
Posts: 41
Joined: Mon Jun 10, 2013 1:21 pm

Re: Webservices

Post by mterraz »

Hola Horacio, lo importante mas que nada es la forma en que realiza la consulta con el webservice.
Todo lo que envie es a modo de ejemplo, como conectarse a un webservice y obtener una respuesta, esa era la idea del ejemplo.

Saludos Mariano
Dioni
Posts: 28
Joined: Tue May 12, 2009 8:45 pm
Location: Lima - Perú

Re: Webservices conecion vias POST

Post by Dioni »

Hola Amigos nececito ayuda veo que tienen el hilo para XML, pero me piden con informacion de Archivos JSON

codigo token
8d19d8c7c1f6402687720eab85cd57a54f5a7a3fa163476bbcf381ee2b5e0c69

Deberá usar ese código TOKEN para autentificarse en la URL https://www.nubefact.com/api/beta/invoices via HTTP Authentication
enviando VIA POST en el HEADER la siguiente información:
Authorization Token token="8d19d8c7c1f6402687720eab85cd57a54f5a7a3fa163476bbcf381ee2b5e0c69"
Content-Type application/json

luego enviar un formulario con este contenido.

prueba.json
{
"invoice": {
"tipo": "1",
"serie": "F001",
"entidad_numero_de_documento": "20553510661",
"entidad_tipo_de_documento": "6",
"entidad_denominacion": "LLAMA.PE SA",
"entidad_direccion": "CALLE LIBERTAD 116 LIBERTAD - LIMA - PERU",
"entidad_email": "hola@llama.pe",
"fecha_de_emision": "05-05-2016",
"fecha_de_vencimiento": "",
"moneda": "1",
"tipo_de_cambio": "",
"operacion_gratuita": "false",
"total_gravada": "1000",
"total_inafecta": "",
"total_exonerada": "",
"total_igv": "180",
"total_gratuita": "",
"descuento_global": "",
"total_otros_cargos": "10",
"total": "1190",
"detraccion": "false",
"observaciones": "",
"documento_que_se_modifica_tipo": "",
"documento_que_se_modifica_serie": "",
"documento_que_se_modifica_numero": "",
"tipo_de_nota_de_credito": "",
"tipo_de_nota_de_debito": "",
"enviar_automaticamente_a_la_sunat": "true",
"enviar_automaticamente_al_cliente": "true",
"cancelado": "true",
"codigo_unico": "RUC20150800013",
"invoice_lines": [
{
"unit_code": "ZZ",
"cantidad": "2",
"tipo_de_igv": "1",
"valor_unitario": "250",
"precio_unitario": "590",
"subtotal": "500",
"igv": "90",
"total": "590",
"descripcion": "MENU DE DIA"
},
{
"unit_code": "ZZ",
"cantidad": "1",
"tipo_de_igv": "1",
"valor_unitario": "500",
"precio_unitario": "590",
"subtotal": "500",
"igv": "90",
"total": "590",
"descripcion": "INKA KOLA DE 1.5 LITROS"
}
]
}
}


luego recibo un mensaje con los siguientes datos

{
"invoice": {
"serie": "F001",
"numero": 7,
"aceptada_por_sunat": true,
"sunat_description": "La Factura numero F001-7, ha sido aceptada",
"sunat_note": null,
"sunat_responsecode": "0",
"codigo_de_barras": "20219719443 | 01 | F001 | 000007 | 180.00 | 1,190.00 | 05/05/2016 | 6 | 20547551398 | UNv/nKSCy08PFSwAR02wZvqXVcs= | nGEDbsDZsXnrWjf//kpu2BnGeK+DmKZjoSGnCW3na1lki7pktxfDVe8ihxm9\ncrhNi5EPFmdTLcbxcc+W+lCpDj9h8LeIz5MlhdPPEmpZUfLDaBhytf/fruZg\nadQi0WvCjHqW3Z7CRgbJh7t40Wvz9FbPfZhs121baF+fwYwYQpY43lzJR+MR\nMmMeoSVB6kL9TFilUF1EoZ4NTBeFX2hEF9QVkPwqcvcznXIFMmhdG7pvX/p+\nryAYCDbMq4kcmiyqP0xgqL6wHjLiURq1eQa6JssMPm4a1Fag83xSmt62YjYL\ncwvHyG0Asu40jXPOA22kYyFLbGsI94/9ExSKZsPK2w== |"
}
}

COMO VEN NO ES XML.

No se por donde empesar
Gracias por la ayuda
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Re: Webservices

Post by thefull »

Buenas

Te dejo 2 ejemplos muy simples para que veas la luz;

Code: Select all

function test_json_decode()
   local x
   Local aHabs, cHab
   Local cJSON := '{"habitaciones": ["1","2","3","4"]}'
   

    x :=  hb_jsondecode( cJSON, @aHabs )
    for each chab in aHabs["habitaciones"]
        alert( chab)
    next

return nil


function test_json_encode()
   Local hHabs := { "habitaciones" => { "1","2","3","4" } }
     
   Alert( hb_jsonEncode( hHabs, .F. ) )

return nil
 
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Dioni
Posts: 28
Joined: Tue May 12, 2009 8:45 pm
Location: Lima - Perú

Re: Webservices

Post by Dioni »

Hola Thefull..
Gracias por responder. este es el ejemplo que estoy haciendo. pero no logro que estoy haciendo mal..


#include "fivewin.ch"
doc = CreateObject( "MSXML2.DOMDocument" )
ohttp = CreateObject( "MSXML2.XMLHTTP" )
ohttp:Open( "POST" ,"https://www.nubefact.com/api/beta/invoices", .F. )
oHttp:SetRequestHeader( "Connection:", "Keep-Alive" )
ohttp:SetRequestHeader( "Content-Type" ,"application/json" )
ohttp:SetRequestHeader( "Authorization token","e1409d7a0cb44732ab58d3ac33488283d8717f3caeb442eabc50394bb42e902f" )
Ctext:=MEMOREAD("dioni.json")
doc:LoadXML(ctext) //ctext
TRY
ohttp:Send( doc:xml )
CATCH
msginfo("No Se Pudo Enviar Documento XML","Intente Nuevamente")
return .t.
END

response:=ohttp:responseText
Memowrit( 'SendVentasCli_Res.xml',Response)
Ctext1:=MEMOREAD("SendVentasCli_Res.xml")
?ctext1
Retu .t.



contenido de del archivo...
*******************************************
dioni.json
{
"invoice": {
"tipo": "1",
"serie": "F001",
"entidad_numero_de_documento": "20553510661",
"entidad_tipo_de_documento": "6",
"entidad_denominacion": "LLAMA.PE SA",
"entidad_direccion": "CALLE LIBERTAD 116 LIBERTAD - LIMA - PERU",
"entidad_email": "hola@llama.pe",
"fecha_de_emision": "05-05-2016",
"fecha_de_vencimiento": "",
"moneda": "1",
"tipo_de_cambio": "",
"operacion_gratuita": "false",
"total_gravada": "1000",
"total_inafecta": "",
"total_exonerada": "",
"total_igv": "180",
"total_gratuita": "",
"descuento_global": "",
"total_otros_cargos": "10",
"total": "1190",
"detraccion": "false",
"observaciones": "",
"documento_que_se_modifica_tipo": "",
"documento_que_se_modifica_serie": "",
"documento_que_se_modifica_numero": "",
"tipo_de_nota_de_credito": "",
"tipo_de_nota_de_debito": "",
"enviar_automaticamente_a_la_sunat": "true",
"enviar_automaticamente_al_cliente": "true",
"cancelado": "true",
"codigo_unico": "RUC20150800013",
"invoice_lines": [
{
"unit_code": "ZZ",
"cantidad": "2",
"tipo_de_igv": "1",
"valor_unitario": "250",
"precio_unitario": "590",
"subtotal": "500",
"igv": "90",
"total": "590",
"descripcion": "MENU DE DIA"
},
{
"unit_code": "ZZ",
"cantidad": "1",
"tipo_de_igv": "1",
"valor_unitario": "500",
"precio_unitario": "590",
"subtotal": "500",
"igv": "90",
"total": "590",
"descripcion": "INKA KOLA DE 1.5 LITROS"
}
]
}
}
********************************************************************

la respuesta que debo de recibir es..

repuesta.json
{
"invoice": {
"serie": "F001",
"numero": 7,
"aceptada_por_sunat": true,
"sunat_description": "La Factura numero F001-7, ha sido aceptada",
"sunat_note": null,
"sunat_responsecode": "0",
"codigo_de_barras": "20219719443 | 01 | F001 | 000007 | 180.00 | 1,190.00 | 05/05/2016 | 6 | 20547551398 | UNv/nKSCy08PFSwAR02wZvqXVcs= | nGEDbsDZsXnrWjf//kpu2BnGeK+DmKZjoSGnCW3na1lki7pktxfDVe8ihxm9\ncrhNi5EPFmdTLcbxcc+W+lCpDj9h8LeIz5MlhdPPEmpZUfLDaBhytf/fruZg\nadQi0WvCjHqW3Z7CRgbJh7t40Wvz9FbPfZhs121baF+fwYwYQpY43lzJR+MR\nMmMeoSVB6kL9TFilUF1EoZ4NTBeFX2hEF9QVkPwqcvcznXIFMmhdG7pvX/p+\nryAYCDbMq4kcmiyqP0xgqL6wHjLiURq1eQa6JssMPm4a1Fag83xSmt62YjYL\ncwvHyG0Asu40jXPOA22kYyFLbGsI94/9ExSKZsPK2w== |"
}
}
*****************************
User avatar
thefull
Posts: 720
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona
Contact:

Re: Webservices

Post by thefull »

Buenas

Veo que lo que tienes que enviar es un JSON.

Si haces esto ;

Code: Select all

Ctext:=MEMOREAD("dioni.json")
doc:LoadXML(ctext) //ctext
TRY
ohttp:Send( doc:xml )
Parece que lo que estas enviando sería un XML. No se que hace exactamente el ActiveX de M$, pero intentar poner;

Code: Select all

Ctext:=MEMOREAD("dioni.json")
TRY
ohttp:Send( cText )
Saludos
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Dioni
Posts: 28
Joined: Tue May 12, 2009 8:45 pm
Location: Lima - Perú

Re: Webservices

Post by Dioni »

Hola Thefull...

Funciono perfecto mil gracias por tu ayuda... dejo el codigo funcionando..

#include "fivewin.ch"
doc = CreateObject( "MSXML2.DOMDocument" )
ohttp = CreateObject( "MSXML2.XMLHTTP" )
ohttp:Open( "POST" ,"https://www.nubefact.com/api/beta/invoices",.F.)
oHttp:SetRequestHeader("cache-control", "no-cache")
ohttp:SetRequestHeader("content-type", "application/json" )
ohttp:SetRequestHeader("authorization", "Token token=14ea9eac34ba4y8bb3f94ae309c3a03a17180f747ead46029014eff1a453922d" )
Ctext:=MEMOREAD("dioni.json")
?ctext //ver lo que se envia
TRY
ohttp:Send( cText )
CATCH
msginfo("No Se Pudo Enviar Documento JSON","Intente Nuevamente")
return .t.
END
response:=ohttp:responseText
Memowrit( 'SendVentasCli_Res.json',Response)
Ctext1:=MEMOREAD("SendVentasCli_Res.json")
?ctext1 // ver respuesta del servidor .
Post Reply