Ir al contenido principal
Todas las coleccionesGuías de usuario
UbiFunctions: Usando funciones raw
UbiFunctions: Usando funciones raw

Aprende a configurar UbiFunctions avanzadas.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de una semana

NOTA IMPORTANTE: ‘Funciones raw’ es una opción avanzada para usuarios con más experiencia usando el módulo de UbiFunctions.

1. Introducción

Por defecto, UbiFunctions no admite rutas personalizadas, configurar el código de respuesta o recibir/enviar encabezados personalizados. Pero, ¿qué pasa si tu aplicación necesita ese nivel de personalización?

Las UbiFunctions raw ofrecen un nivel avanzado de personalización para usuarios experimentados. Esta guía te guiará a través del uso de estas funciones para personalizar rutas de endpoints, encabezados y códigos de respuesta.

2. ¿Qué son las funciones raw?

Las funciones raw te permiten:

  • Usar una ruta de endpoint personalizada además de la nativa de UbiFunction. Esto permite ejecutar diferentes rutinas según la ruta del endpoint.

  • Recibir y responder con encabezados personalizados. Por ejemplo, encabezados de autorización.

  • Configurar códigos de respuesta personalizados 20X, 40X, 50X, más allá del estándar 200 en UbiFunctions. Esto permite que el cliente HTTP sepa el resultado exacto de la ejecución.

  • Recibir y responder con encabezados Content-Type personalizados para el cuerpo de la solicitud y la respuesta: application/json, plain/text, etc.

3. Habilitar funciones raw

Para habilitar ‘funciones raw’, simplemente activa la opción en el panel izquierdo de la UbiFunction.

4. Entendiendo la estructura de argumentos en funciones raw

Una vez activado, el argumento “args“ recibido en la función principal de la UbiFunction seguirá la siguiente estructura:

{
"path" : "/prv/<YOUR_USERNAME>/<FUNCTION_NAME>/<YOUR_PATH>",
"headers":{
"Content-Type":"plain/text"
},
"body":"A2BF0D"
}

Donde:

Clave

Valor/Tipo

Ejemplo

Path

String representando la ruta raw de UbiFunction. Por defecto es:

/prv/<YOUR_USERNAME>/<FUNCTION_NAME>
/prv/john-doe/get-measurements/temperature
  • john-doe es el nombre de usuario de la cuenta.

  • get-measurements es el nombre de la función raw de UbiFunction.

  • Temperature es la ruta personalizada.

Headers

Diccionario con todos los encabezados en la solicitud que activó la función.

{"Content-Type":"plain/text", "X-Auth-Token":"BBFF-XXYYZZ"}
  • Content-type es la clave que describe el tipo de contenido de la solicitud.

  • X-Auth-Token es el encabezado de autenticación de Ubidots.

Body

Contiene el cuerpo con el que se emitió la solicitud, analizado como una cadena.

"A2BF0D"

5. Ruta de la UbiFunction Raw

Al momento de realizar la solicitud a la UbiFunction, su estructura básica de URL debe permanecer intacta, de lo contrario, la solicitud apuntará a una UbiFunction diferente.

Por ejemplo, supongamos que tienes la siguiente URL de UbiFunction: https://parse.ubidots.com/prv/iot-expo/raw-function/API/Login

Con esto, podrías, por ejemplo, ejecutar múltiples lógicas diferentes en función de la ruta recibida.


Considera que quieres ofrecer tres lógicas diferentes en este endpoint, un login, un logout y una lógica principal, según la ruta que se use para realizar la solicitud. Podrías hacer algo como:

def main(args):

if args["path"] == "prv/iot-expo/raw-function":
return main_page_logic()
elif args["path"] == "prv/iot-expo/raw-function/API/login":
return login_function(args["body"])
elif args["path"] == "prv/iot-expo/raw-function/API/logout":
return log_out_function()

return {
"status_code": int,
"headers": object,
"body": string,
}

Entonces, para ejecutar la lógica de la página principal, todo lo que se necesita es hacer la solicitud HTTP a:

https://parse.ubidots.com/prv/iot-expo/raw-function/

Para la lógica de login:

https://parse.ubidots.com/prv/iot-expo/raw-function/login

Y, por último, para la lógica de logout:

https://parse.ubidots.com/prv/iot-expo/raw-function/logout

6. Argumentos entrantes en la clave body

El contenido del cuerpo en la solicitud HTTP se analiza como una cadena. Por ejemplo:

  • Considera la siguiente solicitud a la UbiFunction mencionada anteriormente:

curl -X POST "https://parse.ubidots.com/prv/iot-expo/raw-function/" \
-H "Content-Type: plain/text" \
-d 24

Ten en cuenta que el número 24 se envió en el cuerpo (-d opción), sin embargo, lo que llega en los argumentos a la UbiFunction es en realidad dicho número convertido a una cadena, tal como:

{"body" : "24"}
  • Supongamos ahora que es necesario enviar una cadena hexadecimal como AFD0E1. Tendrías que hacer la solicitud como:

curl -X POST "https://parse.ubidots.com/prv/iot-expo/raw-function/" \
-H "Content-Type: plain/text" \
-d "AFD0E1"

Entonces, la clave body se verá en Ubidots como:​

{"body" : "AFD0E1"}

En resumen, puedes enviar cualquier contenido en el cuerpo de la solicitud, siempre que se analice como una cadena, y la UbiFunction lo recibirá como tal.

7. Respuesta de las UbiFunctions Raw

En el caso de una UbiFunction no-raw, cuando finaliza su ejecución, normalmente responderá con sus códigos de respuesta predefinidos. Sin embargo, con las funciones Raw, puedes personalizar el código de respuesta, el cuerpo y los encabezados a voluntad, de esa manera, el cliente HTTP que realiza la solicitud sabrá el resultado preciso de la ejecución.


La siguiente es la estructura JSON para personalizar la respuesta:

{
"status_code": 200,
"headers": {"Content-Type": "application/json"},
"body": string,
}

Clave

Valor (valores posibles)/Tipo

Ejemplo

status_code

Número entero:

200, 20x, 40x, 50x
"status_code" : 200

headers

Diccionario que contiene encabezados de respuesta.

{"Content-Type": "text/plain"}

body

Cadena de valor.

{"body" : "[INFO] Successful request"}

Por ejemplo, si la solicitud es válida y la ejecución exitosa, la respuesta JSON sería así:

{
"status_code": 200,
"headers": {"Content-Type": "plain/text"},
"body": "[INFO] Successful request",
}

Por otro lado, si según tu lógica de código la solicitud no es válida, debería responder con un código de respuesta 400, y la respuesta JSON debería verse así:

{
"status_code": 400,
"headers": {"Content-Type": "plain/text"},
"body": "[ERROR] Bad Request, please check your request",
}
¿Ha quedado contestada tu pregunta?