Одна строка, восемь поломок, ноль ошибок
Полина собирает сценарии без кода уже второй год. Её последняя работа выглядит просто: форма на сайте отдаёт заявку в CRM, CRM выгружает строку в таблицу для бухгалтерии, оттуда клиенту уходит письмо. Заявка на оплату курса обучения, семь полей, ничего необычного. Сценарий отработал зелёным — все шаги успешны, ни одного предупреждения.
Через неделю бухгалтерия сказала, что платёж не проходит, клиент — что письмо пришло дважды, а руководитель — что в отчёте за июль появилась заявка, которой в июле не было. Вот та самая строка, которую отдала выгрузка:
В этой строке восемь поломок. Не одна и не две — восемь, и каждая случится по своей причине.
- сумма разорвётся пополам, и все колонки после неё съедут на одну влево
- дата уедет на 29 дней и попадёт в другой месяц
- БИК банка станет восьмизначным
- номер счёта приедет другим числом — не обрезанным, а именно другим
- клиент появится в базе четвёртой карточкой
- ноль в поле «согласие на рассылку» превратится в «да»
- весь текст станет нечитаемым набором букв
- имя первой колонки перестанет совпадать с картой полей
Ни одна из них не выдаст ошибки. Сервис-приёмник не спрашивает, что вы имели в виду. Он домысливает — молча, мгновенно и в свою пользу. Значение остаётся валидным, просто становится другим.
Шестнадцать тем разбирают эти восемь поломок до механизма: почему они происходят, по какому симптому опознаются и какой вопрос надо задать приёмнику, чтобы они не случились. В финале мы вернёмся к этой же строке и разберём её по частям.
Оговорка о границах. Как ответ доехал от сервиса к сервису — тема отдельной лекции про API и вебхуки. Здесь речь о том, что лежит внутри значения: форма записи, тип, пустота, вложенность, единица измерения. Транспорт может быть безупречным, а данные приехать испорченными — это две независимые вещи.
У поля есть тип, и типов ровно семь
Когда сервис отдаёт ответ, внутри лежит не «текст» и не «данные вообще». Внутри лежат значения, у каждого значения есть тип, и набор типов закрыт. В формате JSON, на котором говорит большинство сервисов, типов ровно семь, и список не расширяется по договорённости между вами и приёмником.
Спецификация формата — RFC 8259 — в разделе 3 говорит дословно: «A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false, null, true». Грамматика там же:
| Тип | Как выглядит | Что важно знать |
|---|---|---|
| Строка | «Иванов», «044525225» | внутри может быть что угодно, включая одни цифры |
| Число | 1250.5, 42 | ведущие нули запрещены грамматикой — тема 5 |
| Объект | набор пар «имя — значение» | порядок пар не гарантирован — тема 3 |
| Массив | список значений по порядку | один элемент и список из одного — разные вещи, тема 4 |
| true | true | литерал, а не строка «true» |
| false | false | второй литерал; вместе с первым это и есть «булево» |
| null | null | «значение известно, и оно отсутствует» — тема 2 |
Булевого типа в списке нет как отдельной строки: true и false — два самостоятельных литерала из семи. Тот же раздел спецификации требует: «The literal names MUST be lowercase». Регистр значим. True, FALSE и Null — не значения JSON, а место, где разбор документа обрывается.
Даты. Слово «date» в спецификации формата встречается только в служебных оборотах, как тип оно не определено нигде. Значит, дата всегда едет либо строкой, либо числом — а получатель догадывается, чем именно. На этой догадке держится половина поломок из этой лекции, и ей отданы шесть тем из шестнадцати.
Отсюда первый рабочий вопрос к любому полю: какого оно типа у отправителя и какого типа его ждёт приёмник. Это два разных вопроса, и совпадают ответы далеко не всегда. Второй вопрос — что происходит, когда значения нет вовсе.
active со значением True — с большой буквы. Что это с точки зрения формата?true, false и null. True без кавычек — не строка (у строки были бы кавычки) и не литерал. Это ошибка разбора, и здесь вам повезло: она хотя бы видна. Дальше в лекции будут поломки, которые проходят молча.value = false / null / true / object / array / number / string. Даты в нём нет. Всё, что выглядит как дата, на самом деле строка или число — и то, как приёмник его прочтёт, зависит от приёмника, а не от формата.Дальше нужен аккаунт
Прогресс и монеты сохранятся.