Всех приветствую!
По заголовку наверно многие взглянут на этот вопрос со скептицизмом "Опять ещё какой-то формат", мало нам 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 == ‘....’) {
// ......
}
}
}
}