Примеры кода
Готовые примеры интеграции на популярных языках программирования. Копируйте и адаптируйте под свои нужды.
Календарь для психологов
1. Получение свободных слотов
JavaScript (fetch)
async function getAvailableSlots(date) {
const API_KEY = process.env.VIALINE_API_KEY;
const API_URL = 'https://api.vialine.ru';
try {
const response = await fetch(
`${API_URL}/api/v1/slots?date=${date}`,
{
method: 'GET',
headers: {
'x-api-key': API_KEY,
'Content-Type': 'application/json'
}
}
);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
if (data.success) {
console.log('Доступные слоты:', data.data.slots);
return data.data.slots.filter(slot => slot.available);
} else {
console.error('Ошибка API:', data.error);
return [];
}
} catch (error) {
console.error('Ошибка запроса:', error);
throw error;
}
}
// Использование
getAvailableSlots('2024-10-20')
.then(slots => {
slots.forEach(slot => {
console.log(`Свободно: ${slot.startTime} - ${slot.endTime}`);
});
});Node.js (axios)
const axios = require('axios');
async function getAvailableSlots(date) {
const config = {
method: 'get',
url: `https://api.vialine.ru/api/v1/slots?date=${date}`,
headers: {
'x-api-key': process.env.VIALINE_API_KEY,
'Content-Type': 'application/json'
}
};
try {
const response = await axios(config);
if (response.data.success) {
return response.data.data.slots.filter(
slot => slot.available
);
}
throw new Error(response.data.error?.message || 'Unknown error');
} catch (error) {
if (error.response) {
// Ошибка от сервера
console.error('Ошибка API:', error.response.data);
} else if (error.request) {
// Запрос был отправлен, но ответа нет
console.error('Нет ответа от сервера');
} else {
console.error('Ошибка:', error.message);
}
throw error;
}
}
module.exports = { getAvailableSlots };Python
import os
import requests
from datetime import datetime
def get_available_slots(date):
"""
Получение свободных слотов на указанную дату
Args:
date (str): Дата в формате 'YYYY-MM-DD'
Returns:
list: Список доступных слотов
"""
api_key = os.environ.get('VIALINE_API_KEY')
api_url = 'https://api.vialine.ru'
headers = {
'x-api-key': api_key,
'Content-Type': 'application/json'
}
try:
response = requests.get(
f'{api_url}/api/v1/slots',
headers=headers,
params={'date': date}
)
response.raise_for_status()
data = response.json()
if data.get('success'):
slots = data.get('data', {}).get('slots', [])
available = [s for s in slots if s.get('available')]
return available
else:
error = data.get('error', {})
raise Exception(f"API Error: {error.get('message')}")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
raise
# Использование
if __name__ == '__main__':
slots = get_available_slots('2024-10-20')
for slot in slots:
print(f"Свободно: {slot['startTime']} - {slot['endTime']}")2. Создание записи
JavaScript (fetch)
async function createAppointment(appointmentData) {
const API_KEY = process.env.VIALINE_API_KEY;
const API_URL = 'https://api.vialine.ru';
try {
const response = await fetch(
`${API_URL}/api/v1/appointments`,
{
method: 'POST',
headers: {
'x-api-key': API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify(appointmentData)
}
);
const data = await response.json();
if (response.ok && data.success) {
console.log('Запись успешно создана:', data.data);
return data.data;
} else {
// Обработка ошибок
if (response.status === 409) {
throw new Error('Этот слот уже занят');
} else if (response.status === 400) {
throw new Error('Неверные данные: ' + data.error?.message);
} else {
throw new Error(data.error?.message || 'Неизвестная ошибка');
}
}
} catch (error) {
console.error('Ошибка при создании записи:', error);
throw error;
}
}
// Пример использования
const appointmentData = {
clientData: {
name: 'Иван Иванов',
phone: '+79991234567',
email: 'ivan@example.com'
},
startTime: '2024-10-20T09:00:00Z',
endTime: '2024-10-20T10:00:00Z'
};
createAppointment(appointmentData)
.then(appointment => {
console.log('ID записи:', appointment.id);
console.log('Статус:', appointment.status);
})
.catch(error => {
console.error('Ошибка:', error.message);
});Python
import os
import requests
def create_appointment(client_name, client_phone, start_time, end_time,
client_email=None):
"""
Создание записи на приём
Args:
client_name (str): Имя клиента
client_phone (str): Телефон клиента
start_time (str): Время начала в ISO формате
end_time (str): Время окончания в ISO формате
client_email (str, optional): Email клиента
Returns:
dict: Данные созданной записи
"""
api_key = os.environ.get('VIALINE_API_KEY')
api_url = 'https://api.vialine.ru'
headers = {
'x-api-key': api_key,
'Content-Type': 'application/json'
}
payload = {
'clientData': {
'name': client_name,
'phone': client_phone
},
'startTime': start_time,
'endTime': end_time
}
if client_email:
payload['clientData']['email'] = client_email
try:
response = requests.post(
f'{api_url}/api/v1/appointments',
headers=headers,
json=payload
)
data = response.json()
if response.status_code == 201 and data.get('success'):
print(f"Запись создана! ID: {data['data']['id']}")
return data['data']
elif response.status_code == 409:
raise Exception("Слот уже занят")
elif response.status_code == 400:
raise Exception(f"Неверные данные: {data.get('error', {}).get('message')}")
else:
raise Exception(f"Ошибка API: {data.get('error', {}).get('message')}")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
raise
# Использование
if __name__ == '__main__':
appointment = create_appointment(
client_name='Иван Иванов',
client_phone='+79991234567',
client_email='ivan@example.com',
start_time='2024-10-20T09:00:00Z',
end_time='2024-10-20T10:00:00Z'
)
print(f"Статус: {appointment['status']}")
print(f"Время: {appointment['startTime']} - {appointment['endTime']}")3. React компонент с выбором слота
import { useState, useEffect } from 'react';
function AppointmentBooking() {
const [selectedDate, setSelectedDate] = useState('2024-10-20');
const [slots, setSlots] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [formData, setFormData] = useState({
name: '',
phone: '',
email: ''
});
// Загрузка слотов
useEffect(() => {
async function fetchSlots() {
setLoading(true);
setError(null);
try {
const response = await fetch(
`/api/proxy/slots?date=${selectedDate}`
);
const data = await response.json();
if (data.success) {
setSlots(data.data.slots.filter(s => s.available));
} else {
setError('Ошибка загрузки слотов');
}
} catch (err) {
setError('Ошибка сети');
} finally {
setLoading(false);
}
}
fetchSlots();
}, [selectedDate]);
const handleSubmit = async (e, slot) => {
e.preventDefault();
try {
const response = await fetch('/api/proxy/appointments', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
clientData: formData,
startTime: slot.startTime,
endTime: slot.endTime
})
});
const data = await response.json();
if (data.success) {
alert('Запись успешно создана!');
// Обновить список слотов
setSlots(slots.filter(s => s !== slot));
} else {
alert('Ошибка: ' + data.error?.message);
}
} catch (err) {
alert('Ошибка при создании записи');
}
};
return (
<div className="appointment-booking">
<h2>Запись на приём</h2>
<input
type="date"
value={selectedDate}
onChange={(e) => setSelectedDate(e.target.value)}
/>
{loading && <p>Загрузка слотов...</p>}
{error && <p className="error">{error}</p>}
<div className="slots-list">
{slots.map((slot) => (
<div key={slot.startTime} className="slot-card">
<h3>{new Date(slot.startTime).toLocaleTimeString('ru-RU')}</h3>
<form onSubmit={(e) => handleSubmit(e, slot)}>
<input
type="text"
placeholder="Ваше имя"
value={formData.name}
onChange={(e) => setFormData({...formData, name: e.target.value})}
required
/>
<input
type="tel"
placeholder="Телефон"
value={formData.phone}
onChange={(e) => setFormData({...formData, phone: e.target.value})}
required
/>
<input
type="email"
placeholder="Email (опционально)"
value={formData.email}
onChange={(e) => setFormData({...formData, email: e.target.value})}
/>
<button type="submit">Записаться</button>
</form>
</div>
))}
</div>
</div>
);
}
export default AppointmentBooking;Лазерная резка DXF
1. Загрузка DXF-файла и создание заказа
JavaScript (FormData)
async function createLaserOrder(file, orderData) {
const API_KEY = process.env.VIALINE_API_KEY;
const API_URL = 'https://api.vialine.ru';
const formData = new FormData();
formData.append('dxfFile', file);
formData.append('material', orderData.material);
formData.append('thickness', orderData.thickness);
formData.append('quantity', orderData.quantity);
formData.append('clientEmail', orderData.clientEmail);
try {
const response = await fetch(
`${API_URL}/api/v1/laser-dxf/orders`,
{
method: 'POST',
headers: {
'x-api-key': API_KEY
// НЕ добавляйте Content-Type для FormData
},
body: formData
}
);
const data = await response.json();
if (response.ok && data.success) {
console.log('Заказ создан:', data.data);
return data.data;
} else {
throw new Error(data.error?.message || 'Ошибка создания заказа');
}
} catch (error) {
console.error('Ошибка:', error);
throw error;
}
}
// Использование с file input
const fileInput = document.getElementById('dxf-file');
const file = fileInput.files[0];
const orderData = {
material: 'steel',
thickness: 3.0,
quantity: 5,
clientEmail: 'client@example.com'
};
createLaserOrder(file, orderData)
.then(order => {
console.log('ID заказа:', order.orderId);
console.log('Стоимость:', order.estimatedCost);
console.log('Время изготовления:', order.estimatedTime, 'минут');
});Python (requests)
import os
import requests
def create_laser_order(dxf_file_path, material, thickness,
quantity, client_email):
"""
Создание заказа на лазерную резку
Args:
dxf_file_path (str): Путь к DXF-файлу
material (str): Материал (steel, aluminum, brass)
thickness (float): Толщина материала в мм
quantity (int): Количество деталей
client_email (str): Email для уведомлений
Returns:
dict: Данные созданного заказа
"""
api_key = os.environ.get('VIALINE_API_KEY')
api_url = 'https://api.vialine.ru'
headers = {
'x-api-key': api_key
}
with open(dxf_file_path, 'rb') as f:
files = {
'dxfFile': (os.path.basename(dxf_file_path), f, 'application/dxf')
}
data = {
'material': material,
'thickness': thickness,
'quantity': quantity,
'clientEmail': client_email
}
try:
response = requests.post(
f'{api_url}/api/v1/laser-dxf/orders',
headers=headers,
files=files,
data=data
)
result = response.json()
if response.status_code == 201 and result.get('success'):
order = result['data']
print(f"Заказ создан! ID: {order['orderId']}")
print(f"Стоимость: {order['estimatedCost']} руб.")
print(f"Время: {order['estimatedTime']} мин.")
return order
else:
error = result.get('error', {})
raise Exception(f"Ошибка API: {error.get('message')}")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
raise
# Использование
if __name__ == '__main__':
order = create_laser_order(
dxf_file_path='./parts/bracket.dxf',
material='steel',
thickness=3.0,
quantity=5,
client_email='client@example.com'
)2. Проверка статуса заказа
JavaScript
async function getOrderStatus(orderId) {
const API_KEY = process.env.VIALINE_API_KEY;
const API_URL = 'https://api.vialine.ru';
try {
const response = await fetch(
`${API_URL}/api/v1/laser-dxf/orders/${orderId}`,
{
method: 'GET',
headers: {
'x-api-key': API_KEY,
'Content-Type': 'application/json'
}
}
);
const data = await response.json();
if (response.ok && data.success) {
const order = data.data;
console.log('Статус заказа:', order.status);
console.log('История:', order.statusHistory);
return order;
} else {
throw new Error(data.error?.message || 'Ошибка получения статуса');
}
} catch (error) {
console.error('Ошибка:', error);
throw error;
}
}
// Использование
getOrderStatus('dxf_550e8400e29b41d4')
.then(order => {
switch(order.status) {
case 'PENDING':
console.log('Заказ принят в обработку');
break;
case 'PROCESSING':
console.log('Заказ в производстве');
break;
case 'READY':
console.log('Заказ готов к выдаче');
break;
case 'DELIVERED':
console.log('Заказ доставлен');
break;
}
});Python
import os
import requests
from datetime import datetime
def get_order_status(order_id):
"""Получение статуса заказа"""
api_key = os.environ.get('VIALINE_API_KEY')
api_url = 'https://api.vialine.ru'
headers = {
'x-api-key': api_key,
'Content-Type': 'application/json'
}
try:
response = requests.get(
f'{api_url}/api/v1/laser-dxf/orders/{order_id}',
headers=headers
)
data = response.json()
if response.ok and data.get('success'):
order = data['data']
print(f"Заказ {order['orderId']}")
print(f"Статус: {order['status']}")
print(f"Материал: {order['material']}, {order['thickness']}мм")
print(f"Количество: {order['quantity']}")
print(f"Стоимость: {order['estimatedCost']} руб.")
# История статусов
print("
История изменений:")
for item in order.get('statusHistory', []):
timestamp = datetime.fromisoformat(
item['timestamp'].replace('Z', '+00:00')
)
print(f" {item['status']}: {timestamp.strftime('%Y-%m-%d %H:%M:%S')}")
return order
else:
error = data.get('error', {})
raise Exception(f"Ошибка API: {error.get('message')}")
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
raise
# Использование
if __name__ == '__main__':
order = get_order_status('dxf_550e8400e29b41d4')Лучшие практики
Обработка ошибок
Всегда обрабатывайте возможные ошибки и предоставляйте понятные сообщения пользователям
- • Используйте try-catch блоки
- • Проверяйте статус ответа
- • Логируйте ошибки
- • Показывайте дружественные сообщения
Rate Limiting
Учитывайте лимиты запросов и реализуйте retry логику
- • Используйте экспоненциальную задержку
- • Следите за заголовком retryAfter
- • Кешируйте данные когда возможно
- • Батчируйте запросы
Безопасность
Защищайте API-ключи и данные пользователей
- • Не раскрывайте ключи в коде
- • Используйте переменные окружения
- • Проксируйте запросы через бэкенд
- • Валидируйте входные данные
Тестирование
Тестируйте интеграцию перед продакшеном
- • Используйте тестовые ключи
- • Проверяйте edge cases
- • Тестируйте обработку ошибок
- • Мониторьте production использование