Найти тему
El Vinto

Формат передачи данных Vinto

Всех приветствую!

По заголовку наверно многие взглянут на этот вопрос со скептицизмом "Опять ещё какой-то формат", мало нам XML, JSON, YAML, однако не стоит рубить с плеча.

Примерно 7 лет назад при проектировании задач обмена в связке 1С - PHP - Java android стал понимать, что много информации передаётся впустую, а при передачи коротких информационных данных большой объём составляет паразитная информация, на которую накладывает замысловатый синтаксис каждого из перечисленных языков. Иными словами, все эти форматы передают много "мусора" чтобы выдержать синтаксис, и этот объём огромен. Если вы захотите передать через них двоичные данные, то тоже нужно где-то это объяснять. Если вы в JSON захотите предать строку, которая содержит символы перевода строки или двоеточие - опять проблемы. Это и послужило для меня в то время сигналом, чтобы сделать свой формат, который бы многое упростил, при этом можно было бы передавать любые данные и иметь возможность оценить их визуально в виде текста, когда исходные данные выводятся в отладку. С тех пор я использую этот формат в любых случаях, где не накладываются ограничения (когда заказчик не встаёт рогом, мол хочу в XML и начхал я на другие форматы). Предлагаю вашему вниманию этот формат.

Формат передачи данных ElVinto.

Версия 2.
Дата модификации: 08.01.2023
Дата документа: 29.08.2023

Введение
Формат позволяет передавать данные между клиентами при помощи протоколов HTTP или HTTPS.

Формат имеет следующие характеристики:
1. Является условно-читаемым и редактируемым без использования сторонних средств (из блокнота)
2. Позволяет передавать двоичные данные
3. Имеет оптимизированную структуру и исключает большую часть паразитных символов
4. Жестко структурирован, однако позволяет передавать данные любого типа
5. Формат крайне легко парсится

1. Правила синтаксиса:

Команды отделяются точкой с запятой. Имя каждой команды всегда располагается вначале.
Параметры отделяются запятой.
Имя параметра и значение параметра отделяются знаком < (меньше).
Имя параметра или команды упрощаются слева и справа (удаляются не символы командой trim).
Если нужно передать тип значения, то имя параметра отделяется от описания типа знаком @ (собака), например:

SET_VAR,ABC@INTEGER<#24;

Команды и имена параметров не могут содержать вышеперечисленные символы, а также символ # (решетка)

Если нужно передать строку, в которой нет вышеперечисленных символов, то после знака разделения имени параметра и его значением ставится знак # (решетка).
Если в значении параметра нужно передать вышеперечисленные символы или двоичные данные или данные которые теоретически могут их содержать, то строка кодируется base64, а символ
# (решетка) не ставится, например:

SET_VALUE,DEF<SGVsbG8h;

соответствует

SET_VALUE,DEF<#Hello!;

Порядок расположения параметров каждой команды не имеет значения
Код парсинга для PHP:

class VintoFormat {
private static function getValue($v) {
return (substr($v, 0, 1) == '#') ? substr($v, 1) : base64_decode($v);
}

private static function getParms($commandString) {
$ar = explode(',', $commandString);

$parms = array();

foreach($ar as $v) {
$ex = explode('<', $v);

if(sizeof($ex) == 1) {
$parms[''] = trim($ex[0]);
} else {
$name = trim($ex[0]);
$value = self::getValue($ex[1]);

$parms[$name] = $value;
}
}

return $parms;
}

public function runData(data) {
$ex = explode(';', $data);

foreach($ex as $commandLine) {
$parms = $this->getParms($commandLine);

$cmd = trim($parms['']);

if ($cmd == ‘......’) {
// ......
} else if ($cmd == ‘....’) {
// ......
}
}
}
}