Usar SDK de plugins WV¶
Para permitir la recuperación de datos de usuario, la ejecución de operaciones, la gestión de eventos, etc., un plugin de WebView (cliente) debe establecer una comunicación fiable con la aplicación de cTrader (host). El SDK de plugins de WebView facilita estas interacciones con cTrader. En esta guía se explica el proceso de comunicación entre cliente y host.
Instalación del SDK ¶
El SDK de plugins WebView está disponible como paquete npm. Para instalar el SDK, navegue hasta el directorio de su proyecto en una ventana del terminal y ejecute este comando:
npm install @spotware-web-team/sdk
Sincronización cliente-host ¶
Nota
Los protocolos pertinentes están disponibles como mensajes de referencia.
Antes de proceder a intercambiar mensajes, debe establecer un canal de comunicación. Las operaciones típicas incluyen:
-
Al inicio de la comunicación, se produce un intercambio de eventos activos en el que tanto el cliente como el host envían un evento.
-
El host envía un evento de registro (
payloadType = 2000). Ejemplo:window.dispatchEvent(new MessageEvent('message-from-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2000} })) -
El plugin de WebView envía un evento de confirmación (
payloadType = 2001). Ejemplo:window.dispatchEvent(new MessageEvent('message-to-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2001} })) -
Para cada nuevo evento de confirmación, se envía un nuevo evento de registro para garantizar la sincronización, aunque se reinicialice el plugin.
Nota
Si alguna de las partes no recibe el evento activo correspondiente, el plugin no se montará. Para evitar bucles, el plugin debe enviar el evento de confirmación solo una vez y llevar un seguimiento del flujo de mensajes.
Advertencia
El envío de múltiples eventos de confirmación activa eventos de registro repetidos, que pueden dar lugar a un bucle no deseado.
Solicitudes ¶
Una vez completada la sincronización, el plugin puede interactuar con los servicios de cTrader llamando a métodos SDK que se comunican internamente con el host.
-
El plugin llama a un método SDK. Por ejemplo, puede solicitar la información de la cuenta de un usuario.
-
El plugin de WebView envía una solicitud. Ejemplo:
{ "payloadType": 2100, "payload": { "payloadType": 175, "clientMsgId": "asd1-asd1" }, "clientMsgId": "asd2-asd2" }Internamente, establece dos campos
clientMsgId(interno y externo):- El interno identifica la solicitud específica dentro de la carga útil y cTrader lo utiliza para emparejar esa solicitud con su respuesta correspondiente, así como con eventos relacionados.
- El externo (cuando se usa junto con el interno) lleva el seguimiento del flujo general de mensajes entre cliente y host.
-
El host escucha las solicitudes:
window.addEventListener('message-to-host', function (event) {})
Nota
Todos los métodos SDK para enviar solicitudes y recibir respuestas están disponibles como mensajes del servidor de referencia, mientras que los detalles sobre los campos repetidos dentro de las solicitudes y respuestas se proporcionan como modelos.
Respuestas ¶
-
El host envía una respuesta:
window.dispatchEvent(new MessageEvent('message-from-host', { data }))Cada respuesta incluye el
clientMsgIdoriginal para vincularlo con la solicitud. La respuesta se basa en esta estructura:payloadType: 2101 clientMsgId: "<same-id-as-request>"Las respuestas en tiempo real o múltiples generan nuevos eventos mediante:
payloadType: 2102 clientMsgId: "<same-id-as-request>" -
El cliente escucha la respuesta:
window.addEventListener('message-from-host', function (event) {})
Eventos y suscripciones ¶
Los plugins de WebView pueden suscribirse a datos en tiempo real como cotizaciones, actualizaciones de operaciones, eventos de ejecución y más.
-
Suscríbase a datos de cotización mediante una solicitud:
{ "payloadType": 2100, // indicates a request "payload": { "payloadType": 601, "symbolId": ["EURUSD_ID"], "clientMsgId": "quote-sub-123" }, "clientMsgId": "asd2-asd2" // outer message ID } -
La suscripción activa el envío periódico de respuestas por parte del host:
{ "payloadType": 2102, // indicates an event "payload": { "payloadType": 3, // mapped to QUOTE_EVENT "payload": { "ask": 85274, "bid": 85271, "depth": [], "high": 85340, "low": 84932, "sessionClose": 85133, "symbolId": 9, "tickbar": [], "timestamp": 1750162811236, "trendbar": [] }, "clientMsgId": "asd1-asd1" // inner message ID }, "clientMsgId": "asd2-asd2" // outer message ID }
Enlaces profundos ¶
Un plugin puede solicitar a cTrader que abra un enlace profundo (URL interna) mediante esta solicitud:
payloadType: 2103
clientMsgId: "<client-msg-id>"
El plugin luego escucha para conocer la respuesta:
payloadType: 2104
clientMsgId: "<same-id-as-request>"
Los plugins de WebView pueden implementar un enlace profundo compatible como se demuestra a continuación:
// Open EURUSD symbol overview
const openEURUSDInfo = useCallback(() => {
const url = baseUrl ? ${baseUrl}symbols/EURUSD/info : 'symbols/EURUSD/info';
openUrl(url);
}, [baseUrl, openUrl]);
Resumen de mensajes ¶
La tabla a continuación resume los mensajes del protocolo.
| Tipo | Tipos de carga útil | Iniciación | Casos de uso |
|---|---|---|---|
| Ciclo de vida/protocolo de enlace | 2000 (evento de registro),2001 (evento de confirmación) | Requerido para inicializar la comunicación del plugin. El host envía un evento de registro, el plugin responde con un evento de confirmación. | Configuración del canal, montaje, preparación para la comunicación. |
| Evento (unidireccional) | 2102 | Iniciado por el servidor. Eventos enviados sin solicitud previa del cliente. El host genera un clientMsgId; el backend de cTrader incluye otro. | Cotizaciones de mercado, actualizaciones de ejecución de operaciones, notificaciones de precio. |
| Solicitud de navegación interna | 2103 (OpenInternalUrlReq), 2104 (OpenInternalUrlRes) | Solicitud iniciada por el plugin para navegar dentro de la aplicación de cTrader. El host procesa y confirma mediante respuesta emparejada. | Abrir la página general de un símbolo, abrir la pantalla de órdenes de un símbolo. |
| Solicitud/respuesta | 2100 (req), 2101 (res) | Iniciado por el plugin. Usado para operaciones de respuesta única. Tanto el clientMsgId interno como el externo se reutilizan en la respuesta. | Obtener información de una cuenta, símbolo u operación. |
| Solicitud/múltiples eventos | 2100 (solicitud), luego múltiples 2102 (eventos) | Una solicitud desencadena un flujo de eventos relacionados. Los eventos reutilizan el clientMsgId original (interno), y el host genera nuevos identificadores de evento. | Colocar una orden, suscribirse a actualizaciones después de un comando. |
| Respuesta de error | 2500 (PublicErrorRes) | El host o cTrader lo utiliza para informar de cualquier fallo al procesar una solicitud. Incluye clientMsgId externo e interno. | Carga útil no válida, acceso no autorizado, solicitud SDK mal formada. |
Manejo de errores ¶
Advertencia
Las razones comunes de errores incluyen plugins desconocidos o no registrados, formatos de solicitud no válidos y fallos de validación del lado del servidor.
Si algo sale mal, el host emite una respuesta de error estructurada:
payloadType: 2500
clientMsgId: <original-id>
{
"payloadType": 2500,
"clientMsgId": "<original-id>",
"error": "InvalidPayload"
}
El SDK maneja el error y lo muestra al creador del plugin.