Apariencia
Ejemplos de Código
Esta sección contiene ejemplos prácticos de integración con la API TSALVA en diferentes lenguajes de programación y herramientas.
🚀 Inicio Rápido
1. Flujo Básico de Oferta
El flujo más común de la API TSALVA:
mermaid
graph LR
A[Crear Oferta] --> B[Recibir Callback]
B --> C[Asignar Detalles]
C --> D[Recibir Webhooks]2. Credenciales de Prueba
Contacta al equipo de TSALVA para obtener credenciales de sandbox:
📧 Email: soporte@robpixels.com
🔑 Solicitar: Credenciales de prueba
🌐 Ambiente: [URL_API] (proporcionada por RobPixels)📚 Ejemplos por Tecnología
🌐 HTTP/cURL
Ejemplos usando cURL desde la línea de comandos:
- Configuración de autenticación
- Todos los endpoints disponibles
- Scripts de automatización
- Manejo de errores
bash
# Ejemplo rápido
curl -X POST "[URL_API]/api/v2/oferta" \
--user "usuario:password" \
-H "Content-Type: application/json" \
-d '{"uuid": "...", "ciudad": "Medellín", ...}'🟨 JavaScript/Node.js
Implementaciones para aplicaciones web y Node.js:
- Cliente HTTP con fetch/axios
- Manejo de callbacks y webhooks
- Validación de respuestas
- Casos de uso comunes
javascript
const response = await fetch('/api/v2/oferta', {
method: 'POST',
headers: {
'Authorization': `Basic ${credentials}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(datosOferta)
});🐍 Python
Código para aplicaciones Python:
- Cliente con requests
- Framework Flask/Django
- Manejo asíncrono
- Integración con bases de datos
python
import requests
from requests.auth import HTTPBasicAuth
response = requests.post(
'[URL_API]/api/v2/oferta',
auth=HTTPBasicAuth('usuario', 'password'),
json=datos_oferta
)🐘 PHP
Implementaciones para aplicaciones PHP:
- Cliente con cURL
- Framework Laravel/Symfony
- Webhooks con PHP
- Manejo de errores
php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => '[URL_API]/api/v2/oferta',
CURLOPT_USERPWD => 'usuario:password',
CURLOPT_POSTFIELDS => json_encode($datos),
]);🎯 Casos de Uso Comunes
1. Servicio de Grúa Básico
javascript
// Crear oferta para grúa liviana
const ofertaGrua = {
uuid: generateUUID(),
ciudad: 'Medellín',
departamento: 'Antioquia',
latitudOrigen: 6.2442,
longitudOrigen: -75.5812,
direccionOrigen: 'Autopista Norte Km 15',
tipoServicio: '2', // Grúa Liviana
descripcionServicio: 'Vehículo averiado requiere traslado a taller',
callbackUrl: 'https://tu-app.com/callback/aceptacion'
};2. Conductor Elegido
javascript
// Servicio de conductor para vehículo del cliente
const ofertaConductor = {
uuid: generateUUID(),
ciudad: 'Bogotá',
departamento: 'Cundinamarca',
latitudOrigen: 4.6097,
longitudOrigen: -74.0817,
direccionOrigen: 'Zona Rosa, Calle 82',
tipoServicio: '1', // Conductor elegido
descripcionServicio: 'Cliente requiere conductor para su vehículo'
};3. Asignación Directa Programada
javascript
// Servicio programado con central específica
const servicioprogramado = {
uuid: generateUUID(),
dniPrestador: '900123456',
tipoServicio: '4', // Ambulancia
fechaCita: '2025-07-05',
horaCita: '10:30',
descripcionServicio: 'Traslado médico programado',
// ... ubicaciones y datos del cliente
};🔧 Utilidades y Helpers
Generador de UUID
javascript
// JavaScript
function generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}python
# Python
import uuid
def generate_uuid():
return str(uuid.uuid4())php
// PHP
function generateUUID() {
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
);
}Validador de Coordenadas
javascript
function validarCoordenadas(lat, lng) {
const latNum = parseFloat(lat);
const lngNum = parseFloat(lng);
if (isNaN(latNum) || isNaN(lngNum)) {
throw new Error('Coordenadas deben ser números válidos');
}
if (latNum < -90 || latNum > 90) {
throw new Error('Latitud debe estar entre -90 y 90');
}
if (lngNum < -180 || lngNum > 180) {
throw new Error('Longitud debe estar entre -180 y 180');
}
return { lat: latNum, lng: lngNum };
}Cliente API Reutilizable
javascript
class TSALVAClient {
constructor(username, password, baseUrl = '[URL_API]') {
this.auth = btoa(`${username}:${password}`);
this.baseUrl = baseUrl;
}
async request(method, endpoint, data = null) {
const config = {
method,
headers: {
'Authorization': `Basic ${this.auth}`,
'Content-Type': 'application/json'
}
};
if (data) {
config.body = JSON.stringify(data);
}
const response = await fetch(`${this.baseUrl}${endpoint}`, config);
const result = await response.json();
if (!response.ok || !result.status) {
throw new Error(result.msg || `HTTP ${response.status}`);
}
return result;
}
async crearOferta(datos) {
return this.request('POST', '/api/v2/oferta', datos);
}
async asignarDetalles(datos) {
return this.request('POST', '/api/v2/asignacion', datos);
}
async obtenerTipos() {
const response = await fetch(`${this.baseUrl}/api/v2/types`, {
headers: { 'Authorization': `Basic ${this.auth}` }
});
return response.json();
}
}
// Uso
const cliente = new TSALVAClient('usuario', 'password');
const tipos = await cliente.obtenerTipos();🔄 Patrones de Integración
1. Patrón Observer (Webhooks)
mermaid
sequenceDiagram
participant App as Tu App
participant API as TSALVA API
participant Central
participant Webhook as Tu Webhook
App->>API: Crear oferta
API->>Central: Distribuir
Central->>API: Aceptar
API->>Webhook: Notificar aceptación
Central->>API: Cambio estado
API->>Webhook: Notificar cambio2. Patrón Polling (Consultas)
javascript
// Verificar estado periódicamente
async function monitorearServicio(idServicio) {
const interval = setInterval(async () => {
try {
const historial = await cliente.consultarHistorial({
line: '1',
autNumber: idServicio
});
const servicio = historial.data[0];
if (servicio && servicio.estado === 'Completado') {
console.log('Servicio completado');
clearInterval(interval);
}
} catch (error) {
console.error('Error consultando estado:', error);
}
}, 30000); // Cada 30 segundos
}3. Patrón Circuit Breaker
javascript
class CircuitBreaker {
constructor(failureThreshold = 5, timeout = 60000) {
this.failureThreshold = failureThreshold;
this.timeout = timeout;
this.failureCount = 0;
this.lastFailureTime = null;
this.state = 'CLOSED'; // CLOSED, OPEN, HALF_OPEN
}
async call(fn) {
if (this.state === 'OPEN') {
if (Date.now() - this.lastFailureTime > this.timeout) {
this.state = 'HALF_OPEN';
} else {
throw new Error('Circuit breaker is OPEN');
}
}
try {
const result = await fn();
this.onSuccess();
return result;
} catch (error) {
this.onFailure();
throw error;
}
}
onSuccess() {
this.failureCount = 0;
this.state = 'CLOSED';
}
onFailure() {
this.failureCount++;
this.lastFailureTime = Date.now();
if (this.failureCount >= this.failureThreshold) {
this.state = 'OPEN';
}
}
}📊 Testing y Debugging
Test de Conectividad
bash
# Script de verificación rápida
curl -f -s --user "usuario:password" \
"[URL_API]/api/v2/types" > /dev/null && \
echo "✅ API funcionando" || \
echo "❌ API no disponible"Logs Estructurados
javascript
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'tsalva-api.log' })
]
});
// Usar en llamadas API
logger.info('Creando oferta', {
uuid: oferta.uuid,
tipo: oferta.tipoServicio
});¿Nuevo en APIs REST?
Si eres nuevo trabajando con APIs REST, te recomendamos empezar con los ejemplos de cURL para familiarizarte con los endpoints antes de implementar en tu lenguaje preferido.
Importante
Todos los ejemplos utilizan URLs de producción. Para pruebas, solicita acceso al ambiente de sandbox del equipo de TSALVA.