Ejemplos
Esta página contiene ejemplos prácticos de uso de la API.
Configuración Inicial
JavaScript/Node.js
javascript
// Importar la librería
import API from '@ejemplo/api-client'
// Crear una instancia
const api = new API({
baseURL: 'https://api.ejemplo.com/v1',
token: process.env.API_TOKEN,
timeout: 30000
})TypeScript
typescript
import API, { APIConfig, User } from '@ejemplo/api-client'
const config: APIConfig = {
baseURL: 'https://api.ejemplo.com/v1',
token: process.env.API_TOKEN,
timeout: 30000
}
const api = new API(config)Python
python
from ejemplo_api import APIClient
api = APIClient(
base_url='https://api.ejemplo.com/v1',
token=os.environ.get('API_TOKEN'),
timeout=30
)Autenticación
Login
javascript
// Iniciar sesión
const response = await api.post('/auth/login', {
email: 'usuario@ejemplo.com',
password: 'contraseña-segura'
})
// Guardar el token
const { token } = response.data
api.setToken(token)
// También puedes guardar en localStorage (navegador)
localStorage.setItem('token', token)Logout
javascript
// Cerrar sesión
await api.post('/auth/logout')
// Limpiar el token
api.clearToken()
localStorage.removeItem('token')Refresh Token
javascript
// Refrescar el token cuando expira
async function refreshToken() {
const refreshToken = localStorage.getItem('refreshToken')
const response = await api.post('/auth/refresh', {
refreshToken
})
const { token, refreshToken: newRefreshToken } = response.data
api.setToken(token)
localStorage.setItem('token', token)
localStorage.setItem('refreshToken', newRefreshToken)
}CRUD Completo
Crear (Create)
javascript
// Crear un nuevo usuario
async function createUser(userData) {
try {
const response = await api.post('/users', {
name: userData.name,
email: userData.email,
password: userData.password,
role: 'user'
})
console.log('Usuario creado:', response.data)
return response.data
} catch (error) {
console.error('Error al crear usuario:', error.message)
throw error
}
}
// Uso
const newUser = await createUser({
name: 'María García',
email: 'maria@ejemplo.com',
password: 'contraseña123'
})Leer (Read)
javascript
// Obtener todos los usuarios con paginación
async function getUsers(page = 1, limit = 10) {
const response = await api.get('/users', {
params: { page, limit }
})
return response.data
}
// Obtener un usuario específico
async function getUser(userId) {
const response = await api.get(`/users/${userId}`)
return response.data
}
// Uso
const users = await getUsers(1, 20)
const user = await getUser('123')Actualizar (Update)
javascript
// Actualizar un usuario
async function updateUser(userId, updates) {
try {
const response = await api.put(`/users/${userId}`, updates)
console.log('Usuario actualizado:', response.data)
return response.data
} catch (error) {
if (error.status === 404) {
console.error('Usuario no encontrado')
} else {
console.error('Error al actualizar:', error.message)
}
throw error
}
}
// Uso
const updated = await updateUser('123', {
name: 'Nuevo Nombre',
email: 'nuevo@ejemplo.com'
})Eliminar (Delete)
javascript
// Eliminar un usuario
async function deleteUser(userId) {
try {
await api.delete(`/users/${userId}`)
console.log('Usuario eliminado exitosamente')
} catch (error) {
console.error('Error al eliminar usuario:', error.message)
throw error
}
}
// Uso
await deleteUser('123')Búsqueda y Filtros
Búsqueda Básica
javascript
// Buscar usuarios por nombre o email
async function searchUsers(query) {
const response = await api.get('/users', {
params: {
search: query,
page: 1,
limit: 20
}
})
return response.data
}
// Uso
const results = await searchUsers('maria')Filtros Avanzados
javascript
// Filtrar usuarios con múltiples criterios
async function filterUsers(filters) {
const response = await api.get('/users', {
params: {
role: filters.role,
status: filters.status,
createdAfter: filters.createdAfter,
createdBefore: filters.createdBefore,
sortBy: filters.sortBy || 'createdAt',
sortOrder: filters.sortOrder || 'desc'
}
})
return response.data
}
// Uso
const activeAdmins = await filterUsers({
role: 'admin',
status: 'active',
createdAfter: '2025-01-01',
sortBy: 'name',
sortOrder: 'asc'
})Subida de Archivos
Subir Imagen de Perfil
javascript
// Subir archivo
async function uploadProfileImage(userId, file) {
const formData = new FormData()
formData.append('file', file)
formData.append('userId', userId)
const response = await api.post('/users/avatar', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
return response.data
}
// Uso en el navegador
const fileInput = document.getElementById('avatar-input')
fileInput.addEventListener('change', async (e) => {
const file = e.target.files[0]
if (file) {
const result = await uploadProfileImage('123', file)
console.log('Imagen subida:', result.url)
}
})Subir Múltiples Archivos
javascript
async function uploadMultipleFiles(files) {
const formData = new FormData()
files.forEach((file, index) => {
formData.append(`file${index}`, file)
})
const response = await api.post('/files/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
return response.data
}Manejo de Errores
Manejo Global de Errores
javascript
// Configurar interceptor de errores
api.interceptors.response.use(
(response) => response,
(error) => {
// Manejar diferentes tipos de errores
switch (error.status) {
case 401:
// No autenticado - redirigir al login
window.location.href = '/login'
break
case 403:
// Sin permisos
alert('No tienes permisos para realizar esta acción')
break
case 404:
// No encontrado
console.error('Recurso no encontrado')
break
case 422:
// Error de validación
if (error.data?.details) {
error.data.details.forEach(detail => {
console.error(`${detail.field}: ${detail.message}`)
})
}
break
case 429:
// Rate limit excedido
alert('Demasiadas peticiones. Por favor, espera un momento.')
break
case 500:
// Error del servidor
alert('Error del servidor. Por favor, intenta más tarde.')
break
default:
console.error('Error:', error.message)
}
return Promise.reject(error)
}
)Reintentos Automáticos
javascript
// Función con reintentos exponenciales
async function fetchWithRetry(
endpoint,
options = {},
maxRetries = 3,
baseDelay = 1000
) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await api.get(endpoint, options)
} catch (error) {
const isLastAttempt = attempt === maxRetries - 1
const shouldRetry = error.status >= 500 || error.status === 429
if (isLastAttempt || !shouldRetry) {
throw error
}
// Esperar con backoff exponencial
const delay = baseDelay * Math.pow(2, attempt)
console.log(`Reintentando en ${delay}ms...`)
await new Promise(resolve => setTimeout(resolve, delay))
}
}
}
// Uso
const data = await fetchWithRetry('/users', {}, 3, 1000)Paginación
Paginación Simple
javascript
// Obtener todas las páginas
async function getAllUsers() {
const allUsers = []
let page = 1
let hasMore = true
while (hasMore) {
const response = await api.get('/users', {
params: { page, limit: 100 }
})
allUsers.push(...response.data.data)
// Verificar si hay más páginas
hasMore = page < response.data.pagination.pages
page++
}
return allUsers
}Paginación Infinita (React)
javascript
import { useState, useEffect } from 'react'
function UserList() {
const [users, setUsers] = useState([])
const [page, setPage] = useState(1)
const [loading, setLoading] = useState(false)
const [hasMore, setHasMore] = useState(true)
const loadMore = async () => {
if (loading || !hasMore) return
setLoading(true)
try {
const response = await api.get('/users', {
params: { page, limit: 20 }
})
setUsers(prev => [...prev, ...response.data.data])
setHasMore(page < response.data.pagination.pages)
setPage(prev => prev + 1)
} catch (error) {
console.error('Error cargando usuarios:', error)
} finally {
setLoading(false)
}
}
useEffect(() => {
loadMore()
}, [])
return (
<div>
{users.map(user => (
<div key={user.id}>{user.name}</div>
))}
{hasMore && (
<button onClick={loadMore} disabled={loading}>
{loading ? 'Cargando...' : 'Cargar más'}
</button>
)}
</div>
)
}Cache y Optimización
Cache Simple
javascript
class CachedAPI extends API {
constructor(config) {
super(config)
this.cache = new Map()
this.cacheDuration = 5 * 60 * 1000 // 5 minutos
}
async getCached(endpoint, options = {}) {
const cacheKey = `${endpoint}${JSON.stringify(options)}`
const cached = this.cache.get(cacheKey)
if (cached && Date.now() - cached.timestamp < this.cacheDuration) {
return cached.data
}
const response = await this.get(endpoint, options)
this.cache.set(cacheKey, {
data: response,
timestamp: Date.now()
})
return response
}
clearCache() {
this.cache.clear()
}
}
// Uso
const api = new CachedAPI({ baseURL: 'https://api.ejemplo.com/v1' })
const users = await api.getCached('/users')WebSocket (Tiempo Real)
javascript
// Conectar a WebSocket
class RealtimeAPI {
constructor(url, token) {
this.ws = new WebSocket(`${url}?token=${token}`)
this.listeners = new Map()
this.ws.onmessage = (event) => {
const message = JSON.parse(event.data)
const listeners = this.listeners.get(message.type) || []
listeners.forEach(callback => callback(message.data))
}
}
on(event, callback) {
if (!this.listeners.has(event)) {
this.listeners.set(event, [])
}
this.listeners.get(event).push(callback)
}
send(type, data) {
this.ws.send(JSON.stringify({ type, data }))
}
close() {
this.ws.close()
}
}
// Uso
const realtime = new RealtimeAPI('wss://api.ejemplo.com/ws', token)
realtime.on('user.created', (user) => {
console.log('Nuevo usuario:', user)
})
realtime.on('user.updated', (user) => {
console.log('Usuario actualizado:', user)
})