Consumir Web Service con REST desde Visual Foxpro 9

9,294 views
Skip to first unread message

Angel

unread,
Jan 28, 2016, 4:11:36 PM1/28/16
to Comunidad de Visual Foxpro en Español
Estimados Amigos,

He podido consumir web services SOAP desde VFP, ahora necesito consumir Web Services con REST, alguien tiene algún ejemplo para que me pueda ayudar?

Saludos,

Angel.

Victor Espina

unread,
Jan 29, 2016, 8:35:17 AM1/29/16
to Comunidad de Visual Foxpro en Español
Bajate mi libreria JSON:


La clase contiene un metodo llamado httpGet() que te permite consumir un webservice tipo REST (solo mediante llamadas GET por ahora) y obtener el resultado en forma de un objeto.   El metodo soporta respuesta en JSON y XML.

Saludos

Victor Espina

mapner

unread,
Jan 29, 2016, 11:29:53 AM1/29/16
to Comunidad de Visual Foxpro en Español
Hola,

RESTful es un protocolo de intercambio de datos sobre HTTP con cuatro posibles métodos similares a un CRUD o ABMC:
GET: para hacer consultas y obtener datos, POST: para insertar datos, PUT: modificar datos, DELETE: eliminar datos

más abajo envío un posible enfoque de cliente RESTFul desde VFP

El tema es que seguramente los datos de retorno vendrán en formato JSON y ahí tendrás que valerte de alguna librería que convierta este formato a CURSORES o ARRAYS VFP.

PROCEDURE USE_RESTFUL(cURL,cMETHOD,cPARAM1,cDATA1,cPARAM2,cDATA2,cPARAM3,cDATA3,cPARAM4,cDATA4,...)
LOCAL lOk, oHTTP, cDATA, cResponse

TRY

cDATA=cPARAM1+'='+TRANSFORM(cDATA1)
cDATA=cDATA+cPARAM2+'='+TRANSFORM(cDATA2)
cDATA=cDATA+cPARAM3+'='+TRANSFORM(cDATA3)
cDATA=cDATA+cPARAM4+'='+TRANSFORM(cDATA4)

oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')

oHTTP.OPEN(cMETHOD, cURL, .F.)

oHTTP.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded')
oHTTP.SEND(cDATA)
lOk = .T.
CATCH TO loErr
cResponse = '{ "Error:" '+ TRANSFORM(loErr.ErrorNo) + loErr.MESSAGE+'}'
ENDTRY
IF lOk
IF oHTTP.STATUS = 200
cResponse = oHTTP.responseText
ELSE
cResponse = '{"Error": "No se logró la conexión con el Web Service.'+oHTTP.responseText+'"}'
lOk = .F.
ENDIF
ENDIF

oHTTP = NULL

MESSAGEBOX(cResponse)

RETURN lOk

ENDPROC

* Saludos
* mapner
- mostrar texto citado -


El jueves, 28 de enero de 2016, 18:11:36 (UTC-3), Angel escribió:

Jesenia

unread,
Jan 29, 2016, 12:30:54 PM1/29/16
to Comunidad de Visual Foxpro en Español
Hola Victor

Es posible consultar un método con sus parámetros de un servicio utilizando su clase. Como puedo hacerlo? 

Ya descargue la clase he hice mis pruebas pero no doy en el punto.

Saludes y gracias

Jesenia

unread,
Jan 29, 2016, 1:01:31 PM1/29/16
to Comunidad de Visual Foxpro en Español
Hola Mapner 

por ejemplo en un Metodos FacturasVentas(Anio,Mes,Dia)

USE_RESTFUL(cURL, FacturasVentas,Anio,cDATA1,Mes,cDATA2,Dia,cDATA3)

cData1,cData2,cData3 que recibe?

Disculpa la pregunta pero estoy comenzando en esto de los webservice

Saludos

mapner

unread,
Jan 29, 2016, 2:03:39 PM1/29/16
to Comunidad de Visual Foxpro en Español
Mi ejemplo fue un bosquejo en como se podría implementar. 
La idea es que cParam1, ..., cParamN lleven los nombres literales de los parámetros  Restful y cDATA1, .., cDATAN, ... los valores a pasar
Igualmente si lo tuyo es una consulta seguramente debes entrar con método GET donde los parámetros se pasan en conjunto con la URL 

te paso un ejemplo invocando una búsqueda en Google

cParam1="v"
cData1="1.0"
cParam2="q"
cData2="Diego%20Maradona"
cMETHOD="GET"
USE_RESTFUL(cURL,cMETHOD,cParam1,cData1,cParam2,cData2)

PROCEDURE USE_RESTFUL(cURL,cMETHOD,cParam1,cData1,cParam2,cData2)
LOCAL lOk, oHTTP, cDATA, cResponse

TRY
DO CASE
CASE cMETHOD = 'POST'
cSep = ','
CASE cMETHOD = 'GET'
cSep = '&'
ENDCASE

cDATA=cParam1+'='+TRANSFORM(cData1)+cSep
cDATA=cDATA+cParam2+'='+TRANSFORM(cData2)

oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')


DO CASE
CASE cMETHOD = 'GET'
cURL = cURL+'?'+cDATA
ENDCASE

oHTTP.OPEN(cMETHOD, cURL+'?'+cDATA, .F.)

DO CASE
CASE cMETHOD = 'POST'
oHTTP.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded')
CASE cMETHOD = 'GET'
cDATA = ''
ENDCASE

oHTTP.SEND(cDATA)
lOk = .T.
CATCH TO loErr
cResponse = '{ "Error:" '+ TRANSFORM(loErr.ErrorNo) + loErr.MESSAGE+'}'
ENDTRY
IF lOk
IF oHTTP.STATUS = 200
cResponse = oHTTP.responseText
ELSE
cResponse = '{"Error": "No se logró la conexión con el Web Service.'+oHTTP.responseText+'"}'
lOk = .F.
ENDIF
ENDIF

oHTTP = NULL

MESSAGEBOX(cResponse)

RETURN lOk

ENDPROC

* Saludos
* mapner


Victor Espina

unread,
Jan 29, 2016, 6:34:43 PM1/29/16
to Comunidad de Visual Foxpro en Español
Ejecuta este codigo:

DO json
oData
= json.httpGet("http://noiqs.com/sws_avfp/tjqm/restopos/tables/available/6")
?oData.raw -->  respuesta original devuelta por el webservice
oData
= oData.json.data.Tables  && json es objeto obtenido a partir de la respuesta del WS
?oData.count
FOR i
= 1 TO oData.Count
 
?oData.Item[i].tableSec, oData.Item[i].tableNum
ENDFOR


Los servicios web tipo REST pasan sus parametros directamente en el URL (cuando se invocan con el metodo GET) y devuelven una respuesta que puede estar expresada en JSON, XML o incluso HTML.  En el ejemplo, el punto de entrada del webservice tipo REST es www.noiqs.com/sws_avfp/tjqm/restopos, al cual le estamos enviando el comando "tables" con los parametros "available" y "6" (que significa: "dame todas las mesas disponibles para el empleado 6").

El metodo httpGet() de JSON invoca al webservice REST, recibe el resultado y lo convierte en un objeto que luego tu puedes manipular para ver la respuesta obtenida, asi como la respuesta original (propiedad raw).


Victor

Angel

unread,
Jan 29, 2016, 7:36:03 PM1/29/16
to Comunidad de Visual Foxpro en Español
Estimados Señores,

Les doy las gracias por su colaboración en dar respuesta a mis dudas, he podido consumir el web services con algunos cambios, dejo el código que he utilizado para consumir el web sercices.

*SET STEP ON 
lcURL    = "http://IP_Servidor_Web_Services:Puerto/ruta_web_service/web_service"
lcMETHOD = "POST"
lcDATA1 = "Valor de lcPARAM1"
lcDATA2 = "Valor de lcPARAM2"
lcDATA3 = "Valor de lcPARAM3"
lcDATA4 = "Valor de lcPARAM4"
lcDATA5 = "Valor de lcPARAM5"

lcPARAM1 = "usuario" 
lcPARAM2 = "password"
lcPARAM3 = "celular"
lcPARAM4 = "mensaje"
lcPARAM5 = "senderId"

=USE_RESTFUL(lcURL, lcMETHOD, lcPARAM1, lcDATA1, lcPARAM2, lcDATA2, lcPARAM3, lcDATA3, lcPARAM4, lcDATA4, lcPARAM5, lcDATA5)

PROCEDURE USE_RESTFUL(cURL, cMETHOD, cPARAM1, cDATA1, cPARAM2, cDATA2, cPARAM3, cDATA3, cPARAM4, cDATA4, cPARAM5, cDATA5)
LOCAL lOk, oHTTP, cDATA, cResponse

TRY
DO CASE
CASE cMETHOD = 'POST'
cSep = '&'
CASE cMETHOD = 'GET'
cSep = ','
ENDCASE

cDATA=cPARAM1+'='+TRANSFORM(cDATA1)+cSep
cDATA=cDATA+cPARAM2+'='+TRANSFORM(cDATA2)+cSep
cDATA=cDATA+cPARAM3+'='+TRANSFORM(cDATA3)+cSep
cDATA=cDATA+cPARAM4+'='+TRANSFORM(cDATA4)+cSep
cDATA=cDATA+cPARAM5+'='+TRANSFORM(cDATA5)
oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')

oHTTP.OPEN(cMETHOD, cURL, .F.)

oHTTP.setRequestHeader ('Content-Type', 'application/x-www-form-urlencoded')
oHTTP.SEND(cDATA)
lOk = .T.
CATCH TO loErr
cResponse = '{ "Error:" '+ TRANSFORM(loErr.ErrorNo) + loErr.MESSAGE+'}'
ENDTRY
IF lOk
IF oHTTP.STATUS = 200
cResponse = oHTTP.responseText
ELSE
cResponse = '{"Error": "No se logró la conexión con el Web Service.'+oHTTP.responseText+'"}'
lOk = .F.
ENDIF
ENDIF

oHTTP = NULL

MESSAGEBOX(cResponse)

RETURN lOk

Victor Espina

unread,
Jan 30, 2016, 8:31:35 AM1/30/16
to Comunidad de Visual Foxpro en Español
Ese webservice no es REST.

Victor

mapner

unread,
Jan 30, 2016, 9:25:20 AM1/30/16
to Comunidad de Visual Foxpro en Español
Víctor, porque dices que no es REST? hasta donde se ve en el ejemplo final el amigo estaría mandando datos de inserción a una URL con parámetros mediante el método POST. No sería correcto si es que fuera una consulta que la cual se debe realizar con GET, pero para una inserción de datos POST estaría correcto.
Message has been deleted

Victor Espina

unread,
Jan 30, 2016, 10:33:34 AM1/30/16
to Comunidad de Visual Foxpro en Español
Tienes razon.  No vi el POST.  

Victor

Luis Llaberia

unread,
Jan 31, 2017, 2:57:19 PM1/31/17
to Comunidad de Visual Foxpro en Español

Saludos.

Tengo que conectar con este webservice que me dan este ejemplo para probar:

    curl https://www.dlvrapi.com/v1/get-client-services \
    -u USERNAME:API_KEY \
    -d carrier_code=asm \
    -d service_code=asm-14 \
    -d status=1

Con tu ejemplo hago esto y siempre me retorna que son necesarios los parametros de user y key. Por mas combinaciones que pruebo nunca consigo enviar los parametros.
He probado otros ejemplos de otros foros y siempre lo mismo.
A alguien se le ocurre como se envian los parametros a este webservice?
El webservice parece retornar un json y eso ya no seria problema con lo que tengo desarrollado pero no consigo enviar mis parametros.

Esto funciona y retorna el error. En privado puedo dar claves de sandbox para probar.

DO json
oData
= json.httpGet("
https://www.dlvrapi.com/v1/get-client-services")
? oData.raw



jalfon...@gmail.com

unread,
Aug 17, 2018, 4:35:16 PM8/17/18
to Comunidad de Visual Foxpro en Español
Buenas y disculpe a pesar del tiempo de este mensaje
Espero lean por que necesito un apoyo, como hago bajo el procedimiento detallado lineas abajo, ENVIAR UN ARCHIVO hacia el servidor, he logrado comunicarme con el servidor y obtenido una clave token, pero ahora intento enviar un archivo y me envia error (500).

Espero su orientacion y gracias.

Gregori Arjona Toledo

unread,
Aug 18, 2018, 12:24:15 AM8/18/18
to Comunidad de Visual Foxpro en Español
Hola, publica el código que utilizas, quizá alguien te ayude.

Hugo C.

unread,
Aug 18, 2018, 1:05:08 AM8/18/18
to Comunidad de Visual Foxpro en Español
Esto no es mio, pero tienes que hacer algo parecido a esto,  donde en "Authorization", "Basic 

debes de mandar el token que tienes.

loxml = CreateObject("Microsoft.XMLHTTP")
loxml.Open("GET", "https://api.sellbrite.com/v1/warehouses/", .t.)
loxml.setRequestHeader("Content-Type", "application/json")
loxml.setRequestHeader("Authorization", "Basic NjYzZWI0OGYtODk0ZC00MTVkLWI0MjktZjU3OWVkMzgxYzIzOjI3YjQ3NDI2MGU5YmFiZWJkZWE3NDEwOWM2NjUzN2Vj")

loxml.Send()

? loxml.status
? loxml.responseText


Saludos

Qsoft

unread,
Sep 24, 2018, 10:41:21 AM9/24/18
to publice...@googlegroups.com
hola,

pudistes resolver el problema?

Enrique Vasquez B.


Alex Adrián Vargas Mejía

unread,
Sep 26, 2018, 6:09:40 PM9/26/18
to Comunidad de Visual Foxpro en Español
Hola Angel

estoy tratanto de consumir web services soap de desde VFP, y me gustaria que me mandes un ejemplo para poder avanzar con mi codigo, si fueras tan amable.

saludos

Alex

El jueves, 28 de enero de 2016, 16:11:36 (UTC-5), Angel escribió:

Newbie

unread,
Oct 1, 2018, 7:58:05 PM10/1/18
to Comunidad de Visual Foxpro en Español
Grande Victor, como siempre y desde siempre, espero que las heridas vayan sanando, aunque en mi experiencia mientras mas pasa tiempo, es peor.
Saludos mi Vic.

Mario Escudero

unread,
Nov 20, 2018, 6:19:32 PM11/20/18
to Comunidad de Visual Foxpro en Español
Hola Victor:
Un consulta, qué parámetros tendría que cambiar para obtener los datos como salen en tu ejemplo, si uso la URL
Mil gracias de antermano
Un abrazo

Iván Parra

unread,
Apr 15, 2019, 8:36:51 PM4/15/19
to Comunidad de Visual Foxpro en Español
Hola Amigo

Estoy tratando de hacer un programa para obtener el token y posteriormente enviar un archivo y no he logrado nada con vfp, tu ya avanzaste con algo?

Mario Escudero

unread,
Apr 16, 2019, 8:57:25 AM4/16/19
to publice...@googlegroups.com
Hola, la verdad que no....
Estoy trabajando con interfaces como las PSE para enviar facturas y boletas en TXT.
Slds

----
Mario Escudero
995817087 
     

Carlillus

unread,
Oct 21, 2020, 6:30:25 PM10/21/20
to Comunidad de Visual Foxpro en Español
Saludos.

Tengo una Programa de Facturación y necesito enviarle (para Factura Electrónica) vía POST los datos a una API REST hecha en PHP los datos en un archivo JSON.
EJEMPLO: El JSON según el POSTMAN debería quedar así:

{
    "number": 990020004,
    "type_document_id": 1,
    "date": "2020-10-21",
    "time": "09:08:12",
    "resolution_number": "18760000001",
    "prefix": "SETP",
    "sendmail": true,
    "customer": {
        "identification_number": 900000030,
        "dv": 7,
        "name": "CLIENTE PRUEBA",
        "phone": 3170000000,
        "address": "AASDV ASDASD ASDASD ASDASDD",
        "email": "loqu...@gmail.com",
        "merchant_registration": "0000000-00",
        "type_document_identification_id": 6,
        "type_organization_id": 1,
        "municipality_id": 780,
        "type_regime_id": 1
    },
    "payment_form": {
        "payment_form_id": 1,
        "payment_method_id": 10,
        "payment_due_date": "2020-10-21",
        "duration_measure": "1"
    },  
    "allowance_charges": [
        {
            "discount_id": 1,
            "charge_indicator": false,
            "allowance_charge_reason": "DESCUENTO GENERAL",
            "amount": "0.00",
            "base_amount": "840336.13"
        }
    ],
    "legal_monetary_totals": {
        "line_extension_amount": "840336.13",
        "tax_exclusive_amount": "840336.13",
        "tax_inclusive_amount": "1000000.00",
        "allowance_total_amount": "0.00",
        "charge_total_amount": "0.00",
        "payable_amount": "1000000.00"
    },
    "tax_totals": 
    [
        {
            "tax_id": 1,
            "tax_amount": "159663.86",
            "percent": "19",
            "taxable_amount": "840336.13"
        }
    ],
    "invoice_lines": 
    [
        {
            "unit_measure_id": 70,
            "invoiced_quantity": "1",
            "line_extension_amount": "840336.13",
            "free_of_charge_indicator": false,
            "allowance_charges": [{
                    "charge_indicator": false,
                    "allowance_charge_reason": "DESCUENTO GENERAL",
                    "amount": "0.00",
                    "base_amount": "1000000.00"
                }
            ],
            "tax_totals": [
                {
                    "tax_id": 1,
                    "tax_amount": "159663.86",
                    "taxable_amount": "840336.13",
                    "percent": "19.00"
                }
            ],
            "description": "COMISION POR SERVICIOS",
            "code": "COMISION",
            "type_item_identification_id": 4,
            "price_amount": "840336.13",
            "base_quantity": "1"
        }
        
    ]
}

De antemano, muchas gracias por la ayuda.

Atte.
Carlos Nunes
DTB

¨°o.OCarlos NunesO.o°¨

unread,
Oct 22, 2020, 6:43:42 PM10/22/20
to publice...@googlegroups.com
Salu2
_______________________


Muchas gracias por responder. Pero la API REST recibe la información via POST. 

Si sabes de algo más te agradezco.
_______________________
Atte.
¨°o.OCarlos NunesO.o°¨
D.T.B.


--
Visita el Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/ydQMuPJKQ3Y/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/ab5d33a8-cdf1-4414-806e-cf053f029422n%40googlegroups.com.

Fabio Ramirez

unread,
Oct 23, 2020, 4:06:57 PM10/23/20
to Comunidad de Visual Foxpro en Español
Hola Uliliza la dll de chilkatsoft

y alli el objeto  loResp = loHttp.PostJson2(lcUrl,"application/json",Archivojson)
Reply all
Reply to author
Forward
Message has been deleted
Message has been deleted
Message has been deleted
0 new messages