El método GET() de HTTP

Cuando se crearon SOAP (Simple Object Access Protocol) y WSDL (Web Services Description Language) la intención era que todos los WebServices usaran esos estándares. Y aunque al principio tuvieron mucho éxito luego se los fue dejando de lado porque son complicados de entender, se escribe mucho, son relativamente lentos, y usan mucho ancho de banda.

Se los sigue usando, claro que sí, pero cada vez menos. En los cuatro artículos anteriores de esta serie ya hemos visto como usarlos así que seguramente eso ya lo tienes muy claro y podrás consumir sin problemas cualquier WebService basado en SOAP y en WSDL.

Ahora veremos algunos métodos aún más fáciles de implementar aunque desde luego que no se podrían usar en todas las ocasiones.

HTTP (Hyper Text Transfer Protocol) tiene dos métodos de petición. O sea métodos que podemos usar para pedirle algo. Los nombres de esos métodos son GET() y POST().

¿Cuándo se usa el método GET()?

Cuando la solicitud que se enviará al Servidor no es muy grande y los parámetros pueden ser incluidos en la URL.

¿Cuándo se usa el método POST()?

Cuando se quieren enviar muchos datos (por ejemplo, todo un archivo) al Servidor. En este caso los datos a enviar no se colocan en la URL.

En este artículo exploraremos el método de petición GET() y en el siguiente artículo el método de petición POST().

El método GET()

Este método es facilísimo de utilizar porque todo lo que debemos hacer es escribir una URL correcta, no tiene complicaciones, es muy fácil de entender, es la forma más fácil que existe para consumir un WebService. Veamos un ejemplo:

Listado 1. Sumar dos números

lcURL  = "http://free-web-services.com/add?a=12&b=5"
loHTTP = CreateObject("Msxml2.ServerXMLHTTP.6.0")
loHTTP.OPEN("GET", lcURL, .F.)
loHTTP.SEND()
? loHTTP.Status
? loHTTP.responseText

En este caso el método que queremos usar se llama add() (sumar, en castellano) y debe recibir dos parámetros: a y b. Tanto a como b deben ser números enteros.

Para decirle a la URL cuales son los parámetros se debe escribir el símbolo ? y a continuación los parámetros de la forma nombre=valor. Para especificar otro parámetro se usa el símbolo &.

Si miras la URL del Listado 1.: /add significa que queremos ejecutar el método add(), ?a=12 le indica que el nombre del primer parámetro es a y que su valor es 12, & le indica que a continuación escribiremos otro parámetro, b=5 le indica que el nombre del segundo parámetro es b y que su valor es 5.

O sea, en síntesis: estamos creando la solicitud de sumar los números 12 y 5.

Si ejecutas el Listado 1. en la ventana de comandos del Visual FoxPro entonces verás que te muestra el número 17 (o sea, la suma de 12 + 5).

La clase usada en el Listado 1. se llama Msxml2.ServerXMLHTTP.6.0 pero no es la única clase que tenemos disponible, hay otras como veremos más adelante.

Al método OPEN() le decimos que el método de petición que usaremos será el GET(), aún no hemos ejecutado el GET() solamente le estamos diciendo que lo usaremos más adelante.

Luego ejecutamos el método SEND() el cual se encarga de enviar al Servidor nuestra solicitud. O sea, ejecuta al método GET() con la URL especificada.

Siempre, pero siempre, después de ejecutar al método SEND() debemos verificar si todo estuvo ok o si ocurrió un error. ¿Por qué? porque recuerda que estamos usando Internet y los problemas pueden ocurrir.

La propiedad Status contendrá un número que nos indicará el resultado del último SEND() y sus valores más usuales suelen ser:

200 = Todo salió ok
400 = Error en la solicitud, algo se escribió mal en la solicitud
401 = Acceso no autorizado. No tienes permiso
403 = Prohibido. No tienes permiso
404 = URL no encontrada
405 = El método POST() no es soportado
500 = Error interno del Servidor. Suele ocurrir cuando envías mal los parámetros

En la propiedad responseText tendrás la respuesta que te envió el Servidor. En este ejemplo será el número 17.

Listado 2. Sumar dos números con error

lcURL  = "http://free-web-services.com/add?a=XXX&b=5"
loHTTP = CreateObject("Msxml2.ServerXMLHTTP.6.0")
loHTTP.OPEN("GET", lcURL, .F.)
loHTTP.SEND()
? loHTTP.Status
? loHTTP.responseText

Si en la ventana de comandos del Visual FoxPro ejecutas el Listado 2. entonces verás que el valor de la propiedad Status es 500 y el valor de la propiedad responseText es «a is not a valid integer».

¿Por qué? porque el valor del parámetro a es XXX y como sabes XXX no es un número.

A su vez, si los nombres de los parámetros no son los esperados por el Servidor entonces la propiedad Status valdrá 200 (porque enviaste dos números enteros) pero la propiedad responseText estará vacía.

O sea que si en el Listado 1. o en el Listado 2. escribes:

lcURL  = "http://free-web-services.com/add?num1=21&num2=4"

como en el Servidor no existe num1 y tampoco existe num2 entonces en la propiedad Status obtendrás 200 (porque enviaste 2 números, tales como él esperaba) pero la propiedad responseText estará vacía (porque no reconoce a num1 ni a num2).

Es por ese motivo que SIEMPRE después de llamar al método SEND() debes verificar que la propiedad Status sea 200 y que la propiedad responseText no esté vacía. Una propiedad responseText vacía debe llamarte fuertemente la atención y deberías verificar que los nombres de tus parámetros sean exactamente iguales a los esperados por el Servidor.

NOTA: La gran mayoría de los Servidores usan Linux y en Linux las mayúsculas son distintas que las minúsculas, por eso si en el Listado 1. escribes: A=12 & B=5 entonces ¡¡¡no funcionará!!!

Conclusión

Además de SOAP y WSDL hay otras formas de consumir WebServices, la más sencilla y fácil de todas es a través del método de petición GET() del protocolo HTTP.

Aquí lo que se hace es colocar los parámetros en la URL y siempre se reciben dos valores:

  • El estado resultante del último SEND()
  • La respuesta del Servidor

Si el estado resultante es 200 entonces está todo ok, si es cualquier otro número entonces ocurrió un error.

En la respuesta tendremos el dato solicitado, un mensaje de error, o un string vacío.

La forma de enviar la solicitud al Servidor es:

www.miDominioAquí.com/elMétodoSolicitado?Param1=Valor1&Param2=Valor2&Param3=Valor3

donde Param1, Param2, y Param3 son los nombres de las propiedades que espera recibir el Servidor y Valor1, Valor2, y Valor3 son los valores que les queremos asignar a esas propiedades.

Desde luego que la cantidad de valores que enviamos es variable, algunos métodos pueden tener un parámetro, otros pueden tener dos parámetros, otros pueden tener tres parámetros, y así sucesivamente.

De todas maneras, si se emplea el método GET() es que la cantidad de parámetros no es muy grande o que los valores a enviar no son muy grandes, ya que en los otros casos (por ejemplo, si necesitas enviar un archivo) es preferible u obligatorio emplear el método POST().

Artículos relacionados