API de Webhook
Uso: El caso de uso principal para la API de Webhook de Almacenamiento de Datos Externos de Labvanced es transferir datos de participantes en “tiempo real” a un servidor externo/remoto, en lugar de albergar los datos registrados en los servidores de Labvanced.
TENGA EN CUENTA: A diferencia de muchos casos de uso de API, lo que se describe aquí NO es cómo llamar a la API de Labvanced / endpoints (tal funcionalidad no existe por ahora), sino cómo debe configurar/implementar su backend, de manera que nuestra plataforma pueda llamar automáticamente a los endpoints que usted ha implementado para enviar los datos de los participantes directamente a su backend/base de datos en lugar del nuestro.
Disponibilidad: Esta funcionalidad solo está disponible para los titulares de licencias de laboratorio de Labvanced.
1. Configuración de la API de Webhook
Para usar la API de Webhook, primero debe activar la opción de “almacenamiento de datos externo” en “Configuraciones del Estudio” del respectivo estudio de Labvanced en la sección de “Características del Experimento”.
1.1 Parámetros:
- Dirección IP: Ingrese su dirección IP estática donde su servidor externo está funcionando / disponible públicamente.
- Puerto: El puerto que debe usarse para enviar los datos.
- Ruta URL: La ruta URL que debe añadirse después del puerto. Esto es particularmente útil para “espaciar” sus proyectos / datos entrantes, de tal manera que los datos de diferentes experimentos se envían a una ruta URL diferente. La ruta URL es opcional, pero recomendamos encarecidamente usarla.
2. Crear el Servidor / Script para Recibir los Datos de la API de Webhook
Con base en su configuración en el paso 1, debe implementar un servidor que esté disponible en la dirección IP, puerto y ruta URL especificados. Una versión simplificada / ejemplo de tal servidor está disponible en nuestra página de Github aquí.
2.1 Formato de datos: Los datos se envían en formato JSON para todas las rutas excepto la ruta “/file_upload”. La ruta “/file_upload” (usada para cargar archivos binarios como videos grabados o audio) está codificada como “multipart/form-data”, por lo que asegúrese de que los datos entrantes se analicen correctamente como JSON o multipart/form-data / datos binarios.
2.2. Configuración de CORS: Al implementar su backend, debe implementar / permitir el Compartición de Recursos de Origen Cruzado (CORS). Particularmente, debe establecer los siguientes encabezados: “Access-Control-Allow-Origin” (incluir https://www.labvanced.com/), “Access-Control-Allow-Methods” (incluir POST y OPTIONS), “Access-Control-Allow-Headers” (incluir Content-Type).
2.3 Tipos de solicitudes: Todos los tipos de solicitudes son solicitudes POST ya que se utilizan para enviar datos. En este momento, un valor de retorno solo es necesario para la ruta “/file_upload”. Todas las demás rutas no necesitan un valor de retorno especial.
2.4 Tipos de solicitudes / rutas: Cada vez que un participante toma parte en un estudio, se enviarán en total 8 tipos diferentes de solicitudes POST a su servidor (externo/suyo). La ruta “/file_upload” solo se utilizará si su estudio incluye una acción para cargar algunos datos binarios grabados (por ejemplo, audio o video). Cada tipo de solicitud POST tiene una ruta diferente (ruta URL), que se añadirá a la ruta URL especificada en el paso 1. Además, cada tipo de solicitud tiene una estructura/carga diferente, que debe tenerse en cuenta al analizar y almacenar los datos. Vea los detalles en la sección 3.
3. Definiciones de Endpoint de la API de Webhook / Rutas:
A continuación, verá una explicación detallada de cada ruta / endpoint que se utiliza/llama cuando un participante toma parte en el experimento. Idealmente, sugerimos que implemente todos estos endpoints (excepto el 3.1), y se asegure de que todos los datos se analicen y almacenen apropiadamente en su base de datos.
¿Qué endpoints se utilizan, qué servidor se llama cuando?
- El endpoint 3.1 “/startExpPlayer” se envía solo al servidor de Labvanced para cargar la definición del experimento/archivo JSON y los estímulos asociados desde nuestro servidor.
- Los endpoints 3.2, 3.3, 3.4, 3.7 y 3.8 se envían tanto al servidor de Labvanced (necesario para el balanceo de grupos y el flujo general del experimento) como a su servidor externo.
- Los endpoints 3.5 y 3.6 se envían solo a su servidor externo. Tenga en cuenta que todos los datos de prueba/participante se envían a través de la ruta 3.6, que, por lo tanto, es el endpoint más importante de implementar.
- El endpoint 3.9 se envía solo a su servidor externo y se llama cada vez que se ejecuta una “acción de carga” para cargar datos binarios (audio o video).
3.1 Carga del experimento
- Ruta: /startExpPlayer
- Tipo: POST
- Llamado cuando: El participante visita una cierta URL de experimento en labvanced.com Función principal en el servidor de Labvanced: Inicializa la carga del experimento.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
isTestrun | Si los datos son grabados o no | Booleano | NO |
subject_code | Identificador del sujeto a través del parámetro URL | Cadena | NO |
token | Un identificador único para participantes en estudios longitudinales | Identificador de token | NO |
askSubjData | Si se debe mostrar una encuesta inicial, utilizada para asignar a los sujetos en diferentes grupos | Booleano | SÍ |
NOTA: No necesita ser implementado en servidores externos, ya que solo inicializa la carga del experimento desde el servidor de Labvanced hasta la computadora del cliente
3.2 Selección de grupo y sesión
- Ruta: /startFirstPlayerSession
- Tipo: POST
- Llamado cuando: La ruta 3.1 “ /startExpPlayer” devuelve exitosamente desde el servidor de Labvanced.
- Función principal en el servidor de Labvanced: Utilizada para asignar números de grupo y sesión a un sujeto (balanceo del lado del servidor).
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
subject_code | Identificador del sujeto a través del parámetro URL | Cadena | NO |
token | Un identificador único para participantes en estudios longitudinales | Identificador de token | NO |
survey_data | JSON del cuestionario previo al estudio, campos descritos a continuación. | JSON | NO |
survey_data.selectedGender | Género seleccionado del participante | Cadena | NO |
survey_data.selectedAge | Edad seleccionada del participante | Entero | NO |
survey_data.selectedCountry | País/ubicación seleccionada del participante | Cadena | NO |
survey_data.selectedLanguage | Idioma (primero) seleccionado del participante | Cadena | NO |
isTestrun | Si los datos son grabados o no | Booleano | SÍ |
runOnlyGroupNr | Solo usado para probar un cierto número de grupo sin grabaciones de datos | Entero / Falso | NO |
runOnlySessionNr | Solo usado para probar un cierto número de sesión sin grabaciones de datos | Entero / Falso | NO |
groupNr | Número de grupo para este sujeto | Entero | SÍ |
sessionNr | Número de sesión en un estudio longitudinal | Entero | SÍ |
group_name | El nombre del grupo para este sujeto | Cadena | SÍ |
session_name | El nombre de la sesión para este sujeto | Cadena | SÍ |
experiment_name | El nombre del experimento (no el nombre de la publicación) | Cadena | SÍ |
3.3 Inicio del experimento
- Ruta: /setPlayerSessionStartedTime
- Tipo: POST
- Llamado cuando: El participante presiona “Iniciar Experimento”.
- Función en el servidor de Labvanced: Guarda la hora de inicio, nombre de la sesión y del grupo del experimento y comienza el experimento.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
start_time | Hora de inicio del experimento | Marca de Tiempo UNIX | SÍ |
sessionNr | Número de sesión en un estudio longitudinal | Entero | SÍ |
groupNr | Número de grupo para este sujeto | Entero | SÍ |
token | Un identificador único para participantes en estudios longitudinales | Identificador de token | NO |
3.4 Agregar información de metadatos
- Ruta: /addMetaInfo
- Tipo: POST
- Llamado cuando: El participante presiona “Iniciar Experimento”.
- Función en el servidor de Labvanced: Guarda la información meta en el servidor.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
var_data | El JSON que contiene la información meta | JSON | SÍ |
var_data.browserSpec | El navegador que utiliza el sujeto | Cadena | NO |
var_data.versionSpec | La versión del navegador que utiliza el sujeto | Cadena | NO |
var_data.systemSpec | El tipo de dispositivo / SO que utiliza el sujeto | Cadena | NO |
var_data.agentSpec | La cadena de agente de usuario completa | Cadena | NO |
var_data.fullscreen | Indica si el estudio está siempre en pantalla completa | Booleano | NO |
var_data.timeDelayMean | El promedio de precisión de la llamada de JavaScript en milisegundos | Flotante | NO |
var_data.timeDelayStd | La desviación estándar de la precisión de la llamada de JavaScript en milisegundos | Flotante | NO |
var_data.crowdsourcingCode | El código de crowdsourcing / completación para los sujetos | Cadena | NO |
var_data.crowdsourcinSubjId | El ID de trabajadores/crowdsourcing del sujeto | Cadena | NO |
var_data.subjCounterGlobal | Un contador global de sujetos para el número de sujetos en el estudio | Entero | NO |
var_data.subjCounterPer Group | Un contador de sujetos por grupo en el estudio | Array de Enteros | NO |
var_data.roleId | El ID de rol único para estudios multiusuario del sujeto | Entero | NO |
var_data.multiUserGroupId | El global único ID de grupo multiusuario para estudios multiusuario | Uuid | NO |
var_data.displayedLanguage | El idioma de visualización seleccionado para estudios multilingües | Cadena | NO |
var_data.pixelDensityPerMM | La densidad de píxeles de la pantalla | Flotante | NO |
var_data.screenHeight | La altura de la pantalla en píxeles | Entero | NO |
var_data.screenWidth | El ancho de la pantalla en píxeles | Entero | NO |
var_data.windowHeight | La altura de la ventana/viewport en píxeles | Entero | NO |
var_data.windowWidth | El ancho de la ventana/viewport en píxeles | Entero | NO |
3.5 Registrar información sobre una tarea
- Ruta: /recordStartTask
- Tipo: POST
- Llamado cuando: Una nueva tarea comienza en el flujo experimental.
- Función en el servidor de Labvanced: No se llama cuando se activan solicitudes de API externas.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
blockNr | Número actual del bloque (contador creciente) | Entero | SÍ |
blockId | ID único del bloque actual | Uuid | SÍ |
blockName | Nombre del bloque | Cadena | SÍ |
taskNr | Número actual de la tarea (contador creciente) | Entero | SÍ |
taskId | ID de la tarea actual según lo definido en el editor (mismo entre sujetos) | Uuid | SÍ |
recTaskId | ID generado en el servidor para la tarea de grabación actual (diferente entre sujetos) | Entero | SÍ |
taskName | Nombre de la tarea actual | Cadena | SÍ |
start_time | Hora de inicio de la tarea | Marca de Tiempo UNIX | SÍ |
3.6 Registrar datos de prueba
- Ruta: /recordTrial
- Tipo: POST
- Llamado cuando: Una prueba finaliza O se ejecuta una acción de registro personalizada.
- Función en el servidor de Labvanced: No se llama cuando se activan solicitudes de API externas.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
recTaskId | ID generado en el servidor para la tarea de grabación actual (diferente entre sujetos) | Entero | SÍ |
taskId | ID de la tarea actual según lo definido en el editor (mismo entre sujetos) | Uuid | SÍ |
trailNr | Número de prueba | Entero | SÍ |
recData | Los datos principales / todas las variables creadas por el usuario por prueba se almacenan aquí | JSON | SÍ |
NOTA: Los datos exactos que se registran por prueba dependen del experimento y la tarea específicos. Un resumen para cada estudio está disponible en la pestaña "Variables" del experimento específico (ver captura de pantalla). También tenga en cuenta que los nombres de las variables de API externas se utilizarán como una clave en la estructura JSON. Por lo tanto, asegúrese de que los nombres de las variables sean únicos. De lo contrario, sobrescribirá los datos. El sistema Labvanced generalmente obliga al usuario a utilizar nombres de variables únicos.
3.7 Finalizar el experimento con éxito
- Ruta: /finishExpSession
- Tipo: POST
- Llamado cuando: El experimento se finaliza con éxito.
- Función en el servidor de Labvanced: Finaliza el estudio y marca el conjunto de datos como completo (importante para el balanceo).
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
end_time | Hora cuando terminó el experimento | Marca de Tiempo UNIX | SÍ |
var_data | Igual que los datos var en la ruta “/addMetaInfo” (información actualizada) | JSON | SÍ |
nextStartTime | Próxima hora de inicio (solo para estudios longitudinales) | Marca de Tiempo UNIX | NO |
nextEndTime | Próxima hora de finalización (solo para estudios longitudinales) | Marca de Tiempo UNIX | NO |
reminderTime | Tiempo hasta la próxima hora de inicio (solo para estudios longitudinales) | Cadena de Tiempo | NO |
selectedEmail | Correo electrónico para enviar recordatorio de participación (solo para estudios longitudinales) | Dirección de Correo Electrónico | NO |
emailReminder | Cuándo enviar el recordatorio (solo para estudios longitudinales) | Cadena | NO |
3.8 Finalizar el experimento con fallo
- Ruta: /errExpSession
- Tipo: POST
- Llamado cuando: El experimento se aborta con un error.
- Función en el servidor de Labvanced: Aborta el estudio y marca el conjunto de datos como incompleto.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expId | Identificador único para el estudio | Entero | SÍ |
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
err_msg | El mensaje de error | Cadena | SÍ |
3.9 Cargar datos binarios (audio o video)
- Ruta: /file_upload
- Tipo: POST
- Llamado cuando: Se ejecuta una acción de carga en el sistema de eventos asociada con algún objeto de grabación de audio o video. Función en el servidor de Labvanced: No se llama cuando se activan solicitudes de API externas.
- NOTA: El servidor debe enviar valores de retorno para esta ruta (explicado a continuación). Si esto no se hace, el desencadenador “onUploadComplete” no se ejecuta y el experimento no puede propagarse correctamente. También tenga en cuenta que los datos en esta ruta están codificados como “multipart/form-data”, ya que incluye tanto datos binarios como no binarios.
- Carga: JSON con los siguientes campos:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
expSessionNr | Identificador único para la sesión de grabación de este participante (contando hacia arriba) | Cadena | SÍ |
newFileName | El nombre de archivo sugerido para almacenar el archivo. El nombre del archivo incluye el nombre de la variable asociada y el número actual, bloque, tarea y prueba. | Cadena | SÍ |
myFile | El archivo real / datos binarios | Binario | SÍ |
Respuesta Requerida:
Nombre del Campo | Descripción | Tipo de Datos | Requerido |
---|---|---|---|
file_guid | Identificador Único Global (guid) para el archivo grabado. Este debe ser generado del lado del servidor y se guardará en la variable asociada con el archivo de modo que más tarde sea fácil entender qué archivo provino de qué objeto de grabación. | Uuid | SÍ |
file_name | El nombre de archivo resultante que el servidor usó para guardar el archivo. Este puede ser (pero no tiene que ser) el mismo nombre de archivo sugerido por el cliente en la solicitud. Este también se almacenará en la variable asociada. | Cadena | SÍ |