Руководства
Введение в веб-платформу Falcon Space. C чего начать?Мануал для начинающего разработчика Falcon SpaceВидео о создании сайтов на Falcon SpaceВопросы и ответы для тех, кто начал разрабатывать на Falcon SpaceТиповые ситуации для админа-разработчика в панели управления Как создать таблицу на сайте по шагамКак создать форму на сайте по шагамКак создать дашборд в личном кабинете пользователяПример создания системы по учету Кадры (HR) на сайтеКак улучшить свой код - заметки по ревизии кодаКак сделать аналитический отчет или таблицу на сайтеПодробное описание процесса создания формы Обратная связьСоздание системы уведомлений из внешних источников (через API)Как отслеживать историю действий пользователя или историю событий по объекту системыКак сделать отслеживание посещений сайта конкретными людьми?Как сделать перевод сайта на другой язык для нетехнического специалистаКак сделать функционал оценки полезности материалаСоздание из под editor структуры личных кабинетов (роли, страницы)Улучшение адаптивности страниц под мобильные устройстваСоблюдение порядка в проекте в процессе сопровождения сайтаКак считать показатели год-к-году (YoY) в отчете по периодамКак добирать данные по объекту из внешних источников по API
Основа Falcon SpaceОсновные компонентыВозможностиКоммуникация пользователейДизайн, стилизация, юзабилити
Гид по стилям Falcon SpaceРуководство по юзабилити сайтов на Falcon SpaceЭлементы стилизации в разметке страниц кабинетов на Falcon SpaceУправление темами сайта. Как создать новую тему дизайна сайтаКак внедрять готовую верстку в страницуКак внедрить форму настроек внешнего вида сайтаГорячие клавиши Falcon SpaceСоздание своей темы для сайтаОграничения по изменению дизайнаКак сделать дизайн сайта со скругленными элементами (или без скруглений)Как сделать свою верхнюю полоску сайта (customHeader)Как внедрить новый шрифтКак через CSS управлять стилями конкретных страницКак показать элемент увеличенным при наведении (например ячейка таблицы)Изменение стилизации через CSSКак поменять столбцы местами на смартфоне (order-1 order-md-2)Как сделать анимацию иконокАнимация элементов. Как работать с анимациейДобавление анимацииУправление анимацией для форм, таблицКастомные CSS файлы для страницыПанели с тенью и со скруглением Как внедрить свой CSS на каждой странице порталаКак сделать основное меню горизонтальнымКак убрать все тени и сделать дизайн плоскимКастом разметка верхней панели (TopMakeup)Интерфейс кабинета - это не методы репозитория CRUD!Как сделать липкую панель сверху страницыКак сделать основное меню белымВывод справа на странице float панелиКак поменять степень затемнения фона у диалогового окнаУправление иконкой в окне alert справа вверху окнаКак стилизовать иконкуВывод на экран денежных сумм (отображение рублей, валюты) - as-moneyКак увеличить картинку на страницеВизуализация воронки на основе данныхКак сделать модальное окно определенной шириныПанели показа подсказок (для базовых инструкций по странице)Как сделать левое меню по умолчанию свернутым?
Лендинги
Работа с лендингами (lands)Как создать новый лендинг?Как максимально быстро создать лендинг на базе Falcon SpaceКак внедрить лендинг со своим шаблоном и стилямиКак создать сайт полностью на лендингах?Как устроен механизм лендингов внутриКак переместить лендинг на главную страницу (или на любую другую)Как сделать набор типовых лендингов (например, карточки товаров)?Как сделать копию лендинга с другим адресом или перенести лендинг на другой сайтКак использовать много раз одну секцию в разных лендахКак отключить секцию лендинга или менять их порядок на лендингеКак задать высоту/подложку секции лендингаКак для ленда подключить скрипты или CSSКак прописать SEO параметры для лендаКак создать свой шаблон новой секции лендинга?Как редактировать секцию лендингаГде посмотреть список лендингов?Как сделать меню лендинга или меню сайта на лендахКак сделать подстановочными фавикон, seo title у лендингаКак сделать так, чтобы PWA работал для лендингов
Универсальный APIИнтеграции
Подключение к удаленным серверам SQL Server через Linked ServerZapier интеграция на платформе Falcon SpaceПрием платежей через Яндекс.КассуИнтеграция с Робокассой (платежный шлюз)Пополнение средств через Yookassa (Юкасса)Прием платежей на сайте через CloudPaymentsИнтеграция с платежным шлюзом LifePayУведомление от ТБанка по операциям с расчетным счетомИнтернет-эквайринг Тинькоф БанкИнтеграция API DaData.ru подсказки по адресамИнтеграция коллтрекинга МАНГО ОФИС (режим Площадка)Интеграция API Курсы валют Центрального Банка РФИнтеграция API Почта РФИнтеграция API Служба доставки СДЭК (CDEK)Интеграция API Служба доставки Деловые линииИнтеграция API IpGeoBase Город по IP-адресуИнтеграция API DaData.ru Город по IP-адресуКак вычислить расстояние между 2 геоточками через Google MapsКак сделать интеграцию с Мой СкладКак сделать вебхук для передачи данных с Тильды на Falcon SpaceСканирование штрихкодов и QR кодов через камеру смартфонаПолучение данных контрагента по ИННВнедрение подсказок dadata на сайтВывод точек на карте Яндекс. Интеграция с Яндекс КартыИнтеграция с телефонией Zadarma.comПолучение данных о контрагенте - интеграция ЗаЧестныйБизнесИнтеграция с AMO CRMИмпорт контактов в CRM из Google КонтактыВход/регистрация через ВКонтакте(vk.com)Интеграция CRM с онлайн чатом на сайте (Replain)Как связать yandex metrika clientID с пользователем сайта?Как сделать обработку входящей почты (создание клиента в CRM из Email)Интеграция сайта с ChatGPT (openAI)Интеграция с Яндекс МетрикаИнтеграция с Youtube. Получение роликов каналаИнтеграция с Ozon, Wildberries - извлечение статистикиИнтеграция с API Яндекс Вебмастер
КаталогиНавигацияДокументыДополнительные компонентыПродвижение, SEOСистемные моменты
Отслеживание изменений хранимых процедур и страниц (logChanges)Логирование изменений объектов на примере хранимых процедурРабота с редактором кода в личном кабинете разработчикаЛогирование событий в приложении (trace)Действия в браузере actions JSONКак быстро перенести решение (таблицы, формы, страницы) на другую базу?Настройка диалоговых окон и alert окошекМелкие удобства для разработчика в личном кабинетеКак отследить и ограничить большое количество однородных запросов на сайтеИзменение процедуры поиска, процедуры общих элементов Layout, процедуры периодического запускаКак изменить длительность показа сообщенийФорма обратной связи по ошибкам, предложениям suggestionКак разграничивать права на уровне бизнес-логики хранимых процедурБезопасная обработка данных и проверка доступа в хранимых процедурахИспользование типовой разметки в виде сниппетов для решения различных задачКак логировать клики на определенных элементах в системеОбработка старых браузеров (сообщение об устаревшем браузере)Безопасность. Как скрыть некоторые заголовки (http headers) в запросахОтображение сообщения об offline (Нет сети)Рабочее место разработчика через терминалОбновляемые метки времени в сообщениях на сайтеПодсказка по интерфейсам хранимых процедур компонентовЗащита от CSRF атак через дополнительный токен в формахДополнительные параметры в @parameters (во многих хранимых процедурах)Как логировать события в Falcon в другую базу (чтобы ограничить рост основной базы данных)Сообщение об использовании куки (Cookies)Как искать код некоего компонента (таблицы, формы и т.д.) на страницеКак сделать так, чтобы почта отправлялась асинхронно без задержекРабота со сниппетами кодаУниверсальная кнопка действия as_submitРежим показа таблицы/формы в alert окнеРеализация системы анализа IP посетителей
Системное администрированиеHOWTO
Как сделать отдельный универсальный поискМодальная ссылка (as-modal)Как идентифицировать анонимного пользователя (по куки)?Дашборды. Как вызвать коллбек после загрузки дашбордаКак вынести правила редиректа в отдельный файл configСтраницы. Как сделать редирект на другую страницу при загрузкеСтраницы. Как изменить текст на главнойСтраницы. Как использовать дополнительные параметры на страницеСтраницы. Как выводить списковые данные в теле страницы (repeater)Страницы. Настройки страницы для формирования главного менюСтраницы. Мне нужен в URL параметр itemID, но там передается из-за сущностей InstanceIDСтраницы. Как сделать мастер описания функционала страницыКак добавить событие в календарь GoogleКак сделать кнопку определенного действияКак сделать горячие клавиши для событий (нажатие кнопки)Как показывать баланс пользователя вверху кабинета?Где взять фото пользователяКак сделать поддомены с разными языками для сайтаКак управлять страницей “404 Страница не найдена”Отслеживание всех действий пользователя в системеКак выводить денежные данныеКак дать возможность некоторым ролям вводить html в формах?Что делать если открытая вкладка (tab) сбрасывается при перезагрузке страницы?Как реализовать создание периодического отчета на почтуПопап (popup) окна - показ модальной формы по событию или таймаутуКак быстро просматривать типовые отчеты с возможностью редактирования SQLКак максимизировать показатели Google PageSpeed для сайта на Falcon SpaceКак реализовать окно уведомления об использовании куки (cookies)Вывод на странице штрихкода (barcode) и QR кодаКак в тексте сделать ссылки кликабельнымиКак внедрить на сайте автоопределение города с возможностью выбораКак внедрить оглавление в текстКак вставить универсальный поиск в любое место страницыКак определить координаты lat lng пользователя в текущий моментКак сделать сортировку дерева с Drag-and-DropКак обновить часть страницы по клику на кнопкеЗагрузка дашборда по ссылке as-dashboard-linkКак запретить копировать текст с сайта. Как добавлять ссылку копирайта в текст при копировании с сайтаКак изменить шаблоны хранимых процедур для Формы, Таблицы и др.Определение местоположения пользователя по IP через API (as-ip)Форма Нашли ошибку по Ctrl+EnterКак определить откуда пришел пользователь на сайт? Фиксация источника посещения пользователем сайтаКак сделать ссылку, которая скроллит к элементу на страницеКак показать/скрыть область на странице по ссылке - as-collapseКак сделать обновление интрефейса у другого пользователя по некоему событию
Таблицы
Как сделать таблицу в модальном окне (открывается в диалоговом окне)Как реализовать подтаблицу (вложенная таблица), подформу в таблицеКак связать 2 таблицы Загрузка таблицы по ссылкеКак связать таблицу и редактирование сущности (зависимая страница)Как использовать комментарии в таблицахКак добавить в фильтре значение Не выбрано со значениемКак установить ширину колонки в таблице Как добавить диапазон даты или чисел (слайдер) в фильтрКак сделать операции только для некоторых строкКак делать различный набор столбцов одной таблицы для разных ролейКак убрать показ количества строк результата в заголовке таблицы? Как сделать сортировку в таблицеКак сделать Editable для галочки (Да/Нет) в AS CRUDКак редактировать колонку с датойКак скрыть строчные операции в таблице для определенных строкКак добавить коллбек после загрузки таблицыОтображение таблиц на смартфонеКак работать с галочками в таблицеЧастые ошибки при настройке таблицы (почему не работает таблица)Как обновить подтаблицу после выполнения некой операцииКак обрабатывать групповые операции через модальную формуКак создать предустановленные фильтры для таблицыКак сделать сворачивание таблицы (collapse table)Как убрать старые dict процедуры в формах и таблицахКак сделать фильтр с деревом галочекКак отключить сохранение состояния таблицы (фильтры)Как сделать ссылку на всю строку таблицыКак передать через URL значение фильтраКак сделать обрезание ячеек таблицыСортировка строк в таблицеСоздание сущности с учетом значений фильтровОптимизация запроса SQL - извлечение данных для таблицыКастомная разметка в таблицеРежим кастом вывода через JS (custom)Как настроить дополнительные шапку и подвал у таблицыКак сделать зависимые фильтры в таблицеИмпорт данных в формате файлов txt, csv через таблицуКак гибко управлять видимостью столбцов таблицыКак сделать раскрытие подстроки через любую ссылкуРежим быстрой фильтрации строк без обращения на серверВыпадающая панель рядом с названием таблицы dropdownPanelКак убрать при загрузке установку фокуса ввода на фильтр (data-nofocus)?Как сделать аналитику по периодам (таблица с интервалами дат)Кастомизация вида операций таблицыСтилизация фильтров таблицы
Формы
Как вывести форму во всплывающем окне рядом с кнопкой (popover)Загрузка формы по ссылкеКак принимать в форму не 1 параметр (itemID), а несколько входящих параметров? data-param-p1Как сделать модальную форму Как добавить коллбек после загрузки формы и после сохранения формы.Как показывать на форме прогресс заполнения (прогресс заполнения формы)Как сделать форму в виде мастера шаговКак сделать подтверждение действия в СМС (SMS) в формеКак установить поля в форме по умолчанию при загрузкеКак показывать изменяющуюся информацию при изменении полейФормы. Как сделать в форме более 1 кнопки действий (несколько кнопок действий на форме)Как правильно обрабатывать цены (дробные числа) на формеКак передать в форму скрытый параметрКак в форме добавить примеры заполнения полей (example)Как выбрать значение списка через справочник в модальном окнеКак сделать окно подтверждения действия формыДинамическое изменение itemID у формы в зависимости от других элементов страницыКак скрывать/показывать, обновлять область на странице при изменении поля формыКак добавить новый элемент, если в списке на форме его нетКак перезагрузить страницу после сохранения формыКак вывести списковые данные или таблицу внутри формыКак сделать зависимые поля в форме (Страна, Город)Как сделать кастомную HTML разметку для формы (jsRender)Как создать кастом форму с подтверждением действия по Email или SMSУстановка фоновой панели для формыКак сделать задержку при сохранении формы (saveDelay)Подсказки-ограничители длины для полей в формеКак динамически изменять тип поля формыКак сохранить значение поля в браузере, чтобы каждый раз его не вбивать при загрузке (оставлять последнее сохраненное). Запоминание поля формы в браузереКак выводить разные данные на одной форме для разных ролейКак сделать форму с сохранением состоянияКак сделать поля с анимацией значенийИспользование Google Recaptcha в формахКак обновить таблицу после сохранения формы в модальном окнеКак указать произвольную маску для поля ввода в формеКастом проверка полей формы через JSКак в выборе даты (datepicker) задать доступные датыКак создать форму для редактирования сущностиЗагрузка формы в выпадающем окне (dropdown)Добавление смайликов (emoji) в поля формКак у формы сделать progress bar при загрузке формыРабота с датами в формахПоказ количества символов рядом с полем в формеКнопка очистки формы ResetКонтроль заполнения ключевых форм на сайтеКак сделать форму с простым подтверждением действия (confirm)Как поменять соотношение длины метки и поляКак при сохранении формы вывести сообщение printlog, а не alert
Поля формы
Поле Список поиска значения (autocomplete, search-select) Как в форме вывести список галочек (множественный выбор поля)Как сделать списки select и chosen с категориями (optgroup)Как сделать выбор адреса и сохранение координат места (lat,lng).Установка графика работы (поле формы weekTime)Как в форму в SaveItem передать некий скрытый параметр (например Куки или параметр URL)Как работать с полем типа Слайдер (ползунок)Как использовать в форме поле Выбор файлов. Типы полей формы files, remoteFile, fileContentКак редактировать текст элементов  HTML в Rich-редактореУправление настройками поля через options_ поляВставка ссылок по шаблону (ютуб ссылка, patternString)Как использовать Флажки и выбор радио с картинкойКак работать с полем ТаймерКак сделать выбор цвета в формеКак вывести дерево с выбором галочекКак выводить и сохранять множественный список через chosen поле.Обработка даты из поля datetime-localРедактор текста - код поля формы html2Как работать с полем Дробное числоКак настроить выбор вариантов для поля Интервал датВыбор из элементов с табуляцией - поле формы tabsТип поля imageCheckbox (флажок-картинка)Поле формы Градиент (gradient)
Загрузка файлов, картинок
Работа с ресурсами. Загрузка картинок, файловУправление файлами на сервере (файловый менеджер)Загрузка на форме текстовых файлов и обработка их в процедуре SaveItemКак добавить в колонку таблицы управление файламиЗагрузка файлов с drop областью и гибкой разметкой (компонент as-files)Как приводить картинки к заданным размерам при загрузке на сайтИмпорт и парсинг файла CSVЧем отличается код типа ресурса от типа объектаКак получить ссылку на ресурсКак установить права доступа на менеджер ресурсов?Как загружать фото с обрезкой Как увеличить размер подгружаемых файлов (как загружать большие файлы)Передача файлов по FTPКак искать битые ресурсы, картинкиПодбор оптимальных параметров менеджера ресурсовПодгружаемые файлыМассовая загрузка картинок в систему ресурсовНе грузится файл через менеджер ресурсовФайлы загружаются на сервер, но при скачивании выходит ошибка 404.3 (загрузка ODT, Проблема с MIME типами)Поддержка Webp формата для оптимизации картинокМассовая оптимизация картинок в менеджерах ресурсовНе выводятся картинки на сайте (401, 403 ошибка при загрузке картинок)Как установить JS callback после выполнения crop картинкиНе отображается картинка юзера справа вверхуКак изменить текст "Нет файлов" в as-resourceManager?Обработка спецсимволов в названии файлов Как поставить водяной знак на картинку при загрузкеКак оптимизировать качество картинок при загрузке на сайтКак создавать для загружаемой картинки копии с разными размерамиКак загружать файл, когда задействовано диалоговое окноКак загрузить файл по конкретному путиКак сделать возможность грузить только 1 фотоКак поставить фильтр на типы файлов и ограничить форматы загрузки картинок?Как обработать событие после удаления или добавления файлов? Не выводятся картинки в менеджере ресурсов. Что делать?Как вставить менеджер ресурсов в форму с заданным itemID
HOWTO SQLHOWTO JSHOWTO ВерсткаРешение проблем

Выгода от использования Falcon Space

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности

Интеграция API Служба доставки Деловые линии

Данный документ описывает реализацию обмена информацией между Falcon Space и службой доставки Деловые линии.

Общие входные данные:

  • Город отправления (Флаг - от двери);
  • Город получения (Флаг - до двери);
  • Длина, см;
  • Ширина, см;
  • Высота, см;
  • Вес, г.

Общий алгоритм:

  1.  Формирование текста запроса с параметрами
  2.  Отправка запроса 
  3.  Получение ответа на запрос
  4.  Парсинг ответа,  получение данных.

Деловые линии - https://dev.dellin.ru/api/

 

Общая информация

API состоит из двух модулей, которые можно обозначить следующим образом: без использования данных клиента — публичный API (например: калькулятор) и с использованием данных клиента — API личного кабинета (например: заказы).

Необходимо учесть, что авторизация для них различна.

 

API умеет общаться при помощи двух форматов данных: JSON и XML. Вы можете использовать любой из них в зависимости от ваших предпочтений.
Различия в функционале между ними - отсутствуют.

 

Взаимодействовать с нашим API необходимо при помощи метода POST,

а выбор формата между JSON и XML осуществляется через передачу заголовка content-type.
Для JSON мы принимаем content-type равный application/json (стандарт RFC4627)

Наше API работает в кодировке utf-8.

Шаг 1 - Зарегистрировать API-ключ

Авторизация приложения

Прежде чем приступить к работе с нашим API вам необходимо пройти процедуру регистрации.

Результатом регистрации в нашей системе, для вас будет ключ приложения.

Зарегистрировать API-ключ

https://dev.dellin.ru/registration/

На почту придет:

Ключ приложения: DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34

 

Шаг 2 - Зарегистрировать Личный кабинет (стандартный)

https://www.dellin.ru/

Некоторые функции Личного кабинета недоступны в режиме ограниченного доступа.

Режимы доступа к Личному кабинету - https://www.dellin.ru/unlimitedAccess/

Расчёт стоимости по публичным тарифам в режиме ограниченного доступа – доступен.

  

Калькулятор стоимости и сроков перевозки - https://dev.dellin.ru/api/calculation/calculator/

Расчет стоимости перевозки – Примеры - https://dev.dellin.ru/api/examples/calculation/

 

Порядок работы:

Работа проходит  в 2 этапа

Этап 1 - Авторизация пользователя и получение sessionID. ( сессия выдается на 1 мес. – 30 дней)

Этап 2 – Работа по полученному  sessionID  отправка запросов по расчету тарифов.

 

Деловые линии - Авторизация - PROCEDURE [dbo].[api_ruDelLinLogin_request]

  • URL: https://api.dellin.ru/v1/customers/login.json
  • Content-Type: application/json
  • Метод запроса: POST
  • Формат на выходе: JSON

Пример текста запроса - request.

URL: https://api.dellin.ru/v1/customers/login.json

JSON – BODY

{
"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",
"login":   "mail@yandex.ru",
"password": "Dellin_test_pwd1"
}

Пример текста ответа - response.

{
    "sessionID": "CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797"
}

DROP TABLE [dbo].[api_DelLinSessions]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[api_DelLinSessions](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[sessionID] [nvarchar](max) NULL,
	[session_start_time] [datetime] NULL,
	[expire_time] [datetime] NULL,
	[response] [nvarchar](max) NULL,
	[errorMsg] [nvarchar](max) NULL,
	[DelLinAppKey] [nvarchar](max) NULL,
	[DelLinLogin] [nvarchar](max) NULL,
	[DelLinPassword] [nvarchar](max) NULL,
	[created] [datetime] NULL,
	[userСreator] [nvarchar](max) NULL,
	[updated] [datetime] NULL,
	[userUpdater] [nvarchar](max) NULL,
 CONSTRAINT [PK_api_DelLinSessions] PRIMARY KEY CLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

CREATE PROCEDURE [dbo].[api_ruDelLinLogin_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
AS
BEGIN
-- Авторизация пользователя , работа с сессией

DECLARE @DelLinAppKey 	nvarchar(max) = ''
      , @DelLinLogin 	nvarchar(max) = ''
      , @DelLinPassword nvarchar(max) = ''

-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации
SET  	@DelLinAppKey  = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET     @DelLinLogin   = 'mail@yandex.ru'
SET  	@DelLinPassword= 'Dellin_test_pwd1'

DECLARE @apiUrl1 		nvarchar(max) = '' 		-- Финальная строка для отправки  -- ФАКТИЧЕСКИ ЭТО Url

DECLARE @jsonRequest1	nvarchar(max) = '' 	    -- текст json-объекта
SET  	@apiUrl1 = N'https://api.dellin.ru/v1/customers/login.json'
/* SET     @jsonRequest1 = N'{' +
                      + N'"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",' +
                      + N'"login": "mail@yandex.ru",' +
                      + N'"password": "Dellin_test_pwd1"' +
                      + N'}' */

SET     @jsonRequest1 = N'{' + CHAR(10)
                      + N'"appkey": "'   + @DelLinAppKey   +'",'+CHAR(10)
                      + N'"login": "'    + @DelLinLogin    +'",'+CHAR(10)
                      + N'"password": "' + @DelLinPassword +'"' +CHAR(10) -- последняя строка без запятой
                      + N'}'

    -- ОТЛАДКА
	 insert into as_trace ( header, text, username, code , created )   values( 'apiUrl1'       , @apiUrl1      , @username, 'api_ruDelLinLogin_request' , GETDATE() )
	 insert into as_trace ( header, text, username, code , created )   values( '@jsonRequest1' , @jsonRequest1 , @username, 'api_ruDelLinLogin_request' , GETDATE() )

        -- SELECT 1
    	select '' Msg, 1 Result
          , @apiUrl1 Url
          , 'application/json' ContentType -- явное указание для HEADER

	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	 select 'id' name
           , @jsonRequest1 value -- это body
           , 'json' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL

-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-- выполнить 1-й api request в результатате Response получим sessionID - ДАННЫЕ В ТАБЛ. api_DelLinSessions
END

Деловые линии - Авторизация - PROCEDURE [dbo].[api_ruDelLinLogin_response]

 Для работы нужна постоянная таблица в базе - [api_DelLinSessions]

 Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.

 Список возможных сообщений об ошибках.

1 -  'Ошибка! Запрос @response вернул ошибку! '… @errorText.

 

Если ошибок в ответе не обнаружено, из ответа выбираются такие данные: sessionID

Далее значение sessionID Записывается в  постоянную таблицу в базе -  [dbo].[api_DelLinSessions]

 

Пример текста – результат: Создана сессия @sessionID = CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797

CREATE PROCEDURE [dbo].[api_ruDelLinLogin_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
-- ! для работы нужна постоянная таблица в базе -  [dbo].[api_DelLinSessions] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

DECLARE @DelLinAppKey 	nvarchar(max) = ''
      , @DelLinLogin 	nvarchar(max) = ''
      , @DelLinPassword nvarchar(max) = ''

-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации - те же параметры, что и в проц. _request
SET  	@DelLinAppKey  = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET     @DelLinLogin   = 'mail@yandex.ru'
SET  	@DelLinPassword= 'Dellin_test_pwd1'

	-- ОТЛАДКА
    -- exec as_print @str='api_ruPostDelivery_response'
	insert into as_trace (text, username, code , created  ) values( @response, @username, 'api_ruDelLinLogin_response' , GETDATE() )


    DECLARE @jsonResponse1	nvarchar(max) = N''
    SET     @jsonResponse1	= @response
-- SET     @jsonResponse1	= N'{"sessionID": "5CE0BDD33-AXXX-XXXX-XXXX-E424C52F1797"}' -- "expire_time": "2020-07-01 16:21:13"
-- SET     @jsonResponse1	= N'{ "errors": "Unauthorized" }'
-- Анализ результатата Response
-- Ответ  		    {   "sessionID": "00000000-0000-0000-0000-000000000000"  }
-- Обработка ошибок	{ "errors": "Unauthorized" }

DECLARE @sessionID NVARCHAR(MAX)
-- Обработка ошибки в ответе
DECLARE @presentError bit = 0, @errorText NVARCHAR(MAX), @errorCode NVARCHAR(MAX), @errorMsg NVARCHAR(MAX)

SELECT  @presentError = IIF( JSON_VALUE( @jsonResponse1, '$.errors') IS NULL  , 0 , 1 )
      , @errorMsg     = JSON_VALUE( @jsonResponse1, '$.errors')
	 --
      , @sessionID    = JSON_VALUE( @jsonResponse1, '$.sessionID')


INSERT INTO [dbo].[api_DelLinSessions] ([sessionID] ,[session_start_time]
			,[response]  ,[errorMsg]  ,[DelLinAppKey]  ,[DelLinLogin] ,[DelLinPassword]
            ,[created]   ,[userСreator]
		   )
     VALUES ( @sessionID, GETDATE()
             ,@response ,  @errorMsg , @DelLinAppKey , @DelLinLogin, @DelLinPassword
             ,GETDATE(),  @username
            )


      IF @presentError = 1
      BEGIN
		  SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
          SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText, '' ) Msg, 0 Result, @jsonResponse1 Response
          RETURN
      END

 -- Данные сессии
 -- https://api.dellin.ru/v1/customers/session_info.json
 -- { "appkey":"00000000-0000-0000-0000-000000000000", "sessionID":"00000000-0000-0000-0000-000000000000" }
 -- ответ для активной сессии 						{  "session": {  "expire_time": "2014-04-12 18:01",   "expired": false    } }
 -- ответ для сессии, срок действия которой истек   {  "session": {  "expire_time": null,   "expired":  true    } }


	-- SELECT 1
	select 'Создана сессия @sessionID = ' + @sessionID AS Msg
         , 1 Result, @response Response

	-- SELECT 2 Внешние действия

END

Деловые линии - Калькулятор - PROCEDURE [dbo].[api_ruDelLinCalculator_request]

  • URL: https://api.dellin.ru/v2/calculator
  • Content-Type: application/json
  • Метод запроса: POST
  • Формат на выходе: JSON

  

Входные данные запроса – параметры процедуры PROCEDURE [dbo].[api_ruDelLinCalculator_request]

Переменная

Тип

Значение по умолчанию

Описание

Примечание

1

@deliveryType

nvarchar(10)

'express'

Вид межтерминальной перевозки груза, для которого будет рассчитана стоимость.

"auto"- автодоставка;

"express" - экспресс-доставка;

"letter" - письмо;

 "avia" - авиадоставка;

"small" - доставка малогабаритного груза.

arrival Данные по доставке груза до получателя

2

@arrival_variant

nvarchar(10)

'terminal'

Способ доставки груза

"terminal" - доставка груза от/до терминала.

"address" - доставка груза от адреса отправителя/до адреса получателя 

3

@arrival_terminalID

nvarchar(256)

 '36'

ID терминала отправки/доставки груза из "Справочника терминалов

terminal id 36  Москва Север

terminal id 17  Москва офис

terminal id 108 Ростов-на-Дону Вавилова

terminal id 30  Архангельск

terminal id 295 Владивосток

derival Данные по доставке груза от отправителя

4

@derival_ variant

nvarchar(10) 

'terminal'

Способ доставки груза

 

5

@derival_terminalID

nvarchar(256)

'295'

 

terminal id 295 Владивосток

6

@derival_produceDate

nvarchar(10)

''

Дата выполнения заказа. "ГГГГ-ММ-ЧЧ"

 

7

@requester_role 

nvarchar(32) 

'sender'

Роль в перевозке

"sender" - отправитель;

 "receiver" - получатель; /

"payer" - плательщик;

 "third" - третье лицо

cargo Информация о грузе 

8

@quantity

int

1

Количество грузовых мест, шт

Значение по умолчанию - "1".

9

@length

numeric(20,3)

10

Длина самого длинного грузового места, м

приходит   Длина (в сантиметрах)   -

ПЕРЕСЧЕТ в  м

10

@width

numeric(20,3)

10

Ширина самого широкого грузового места, м

приходит   Ширина (в сантиметрах) 

ПЕРЕСЧЕТ в  м

11

@weight

numeric(20,3)

100

Вес самого тяжелого грузового места, кг

приходит   Вес (грамм )

ПЕРЕСЧЕТ! Вес (в килограммах)

12

@height

numeric(20,3)

10

Высота самого высокого грузового места, м.     

приходит   Высота (в сантиметрах)  -

ПЕРЕСЧЕТ в  м

13

@freightName

nvarchar(256)

'Не обязательно Характер груза'

Характер груза - описание

Не обязательный параметр

14

@hazardClass

nvarchar(10)

'0'

Класс опасности груза.

Значение по умолчанию - "0"

Оплата перевозки

15

@paymentCity

nvarchar(max)

'2500000100000000000000000'

Код КЛАДР города оплаты

 

16

@paymentType

nvarchar(10)

'cash'

Вид оплаты. Используется для проверки

"cash" - оплата наличными;

 "noncash" - безналичный расчёт

Расчетные параметры

17

@totalVolume

 

 

Общий объём груза, м3.

 

18

@totalWeight

 

 

Общий вес груза, кг.

вес * кол-во

  

Коды городов КЛАДР

name

codeKLADR

г. Москва

7700000000000000000000000

Ростов-на-Дону г (Ростовская обл.)

6100000100000000000000000

Архангельск г (Архангельская обл.)

2900000100000000000000000

Владивосток г (Приморский край)

2500000100000000000000000

 

Перед отправкой запроса, идет поиск значения sessionID из постоянной таблицы в базе -  [dbo].[api_DelLinSessions].

Если sessionID  не обнаружена – возвращается ошибка.

Список возможных сообщений об ошибках.

  1.  Ошибка! Не определен @sessionID для @username
  2.  Ошибка! При определении @sessionID=…  для @username   Возникла ошибка:    @errorMsg

 

Если ошибок нет , формируется запрос.

Пример текста запроса - request.

URL: https://api.dellin.ru/v2/calculator

 

JSON - BODY

{
"appkey": "DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34",
"sessionID":"CCE0BDD33-AXXX-XXXX-XXXX-E424C52F1797",
"delivery":
{
"deliveryType":{
               "type":"express"
               },
"arrival":{
          "variant":"terminal",
          "terminalID":"36"
          },
"derival":{
          "produceDate":"2020-06-03",
          "variant":"terminal",
          "terminalID":"295"
          }
},
"members":{
          "requester":{
                                               "role":"sender"
                                               }
          },
"cargo":{
        "quantity":1,
        "length":0.100,
        "width":0.100,
        "height":0.100,
        "weight":0.100,
        "totalVolume":0.001,
        "totalWeight":0.100,
        "freightName":"Не обязательно Характер груза",
        "hazardClass":"0"
},
"payment":{
          "paymentCity":"2500000100000000000000000",
          "type":"cash"
}
}

Пример текста ответа - response

Ответ приведен не полностью

{
    "metadata": {
        "status": 200,
        "generated_at": "2020-06-04 13:46:27"
    },
    "data": {
        "derival": {
            "terminal": "Владивосток",
            "price": 0,
            "premiumDetails": [],
            "discountDetails": [
                {
                    "name": "Скидка за заказ из Личного Кабинета",
                    "value": 13.5,
                    "date": null,
                    "announcement": true,
                    "public": true
                }
            ],
            "terminals": [
                {
…
                }
            ]
        },
        "express": {
            "price": 1030.0,
            "premium": 0,
            "discount": 0,
            "premiumDetails": [],
            "discountDetails": []
        },
        "arrival": {
            "terminal": "Москва",
            "price": 100.0,
            "premiumDetails": [],
            "discountDetails": [],
            "terminals": [
                {
….
                }
            ]
        },
        "price": 1304.0,
        "priceMinimal": "small",
        "orderDates": {
            "pickup": null,
            "senderTerminalTime": "18:00:00",
            "arrivalToOspSender": "2020-06-04",
            "derivalFromOspSender": "2020-06-05",
            "arrivalToOspReceiver": "2020-06-17",
            "giveoutFromOspReceiver": "2020-06-17 09:00:00",
            "derivalFromOspReceiver": null
        },
        "deliveryTerm": 0,
        "insurance": 159.0,
        "insuranceComponents": {
            "cargoInsurance": 115.0,
            "termInsurance": 44.0
        },
        "notify": {
            "price": 15.0,
            "premium": 0,
            "discount": 0,
            "premiumDetails": [],
            "discountDetails": []
        },
        "simpleShippingAvailable": true
    }
}

CREATE PROCEDURE [dbo].[api_ruDelLinCalculator_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
	-- ВХ.ПАРАМ
    ,@deliveryType nvarchar(10) = 'express' -- Вид межтерминальной перевозки груза, для которого будет рассчитана стоимость.
    										-- "auto"- автодоставка; /"express" - экспресс-доставка; /"letter" - письмо; / "avia" - авиадоставка; /"small" - доставка малогабаритного груза.
    -- arrival Данные по доставке груза до получателя
    ,@arrival_variant  nvarchar(10) = 'terminal'   -- Способ доставки груза  -- "terminal" - доставка груза от/до терминала./ "address" - доставка груза от адреса отправителя/до адреса получателя
    ,@arrival_terminalID nvarchar(256) = '36'      -- ID терминала отправки/доставки груза из "Справочника терминалов"
												   -- ! Допускается передача только одного из следующих параметров: "terminalID", "addressID", "address", "city"
												   --  terminal id 36  Москва Север
												   --  terminal id 17  Москва офис
												   --  terminal id 108 Ростов-на-Дону Вавилова
												   --  terminal id 30  Архангельск
												   --  terminal id 295 Владивосток
    -- Пока не используеется в формировании запроса
    ,@arrival_city nvarchar(max) = '7700000000000000000000000' -- Код КЛАДР города. Используется только для параметра "request.arrival".
                                      -- name	codeKLADR
                                      -- г. Москва	7700000000000000000000000
                                      -- Ростов-на-Дону г (Ростовская обл.)	6100000100000000000000000
                                      -- Архангельск г (Архангельская обл.)	2900000100000000000000000
                                      -- Владивосток г (Приморский край)	2500000100000000000000000


	--  derival Данные по доставке груза от отправителя
    ,@derival_variant     nvarchar(10)  = 'terminal'
    ,@derival_terminalID  nvarchar(256) = '295'        -- terminal id 295 Владивосток
    ,@derival_produceDate nvarchar(10)  = ''           -- Дата выполнения заказа. "ГГГГ-ММ-ЧЧ" Используется только для параметра "request.derival"
    --
    ,@requester_role      nvarchar(32)  = 'sender'    -- Роль в перевозке. "sender" - отправитель; / "receiver" - получатель; / "payer" - плательщик; / "third" - третье лицо
	-- cargo Информация о грузе -- размерность величин, как во всех процедурах -- СДЕЛАТЬ ПЕРЕСЧЕТ !!!
    ,@quantity            int = 1                     -- integer	Количество грузовых мест, шт. Значение по умолчанию - "1".

    ,@length              numeric(20,3) = 10          -- float      Длина самого длинного грузового места, м.
                                                      -- приходит   Длина (в сантиметрах)   - ПЕРЕСЧЕТ в  м  numeric(20,3)
    ,@width               numeric(20,3) = 10          -- float      Ширина самого широкого грузового места, м.
                                                      -- приходит   Ширина (в сантиметрах)  - ПЕРЕСЧЕТ в  м  numeric(20,3)
    ,@weight              numeric(20,3) = 100         -- float      Вес самого тяжелого грузового места, кг
                                                      -- приходит   Вес (грамм )	        – ПЕРЕСЧЕТ! Вес (в килограммах) numeric(20,3)
    ,@height              numeric(20,3) = 10          -- float      Высота самого высокого грузового места, м.
                                                      -- приходит   Высота (в сантиметрах)  - ПЕРЕСЧЕТ в  м  numeric(20,3)
    -- ,@totalVolume	-- РАСЧЕТ        -- float      Общий объём груза, м3. -- РАСЧЕТ
    -- ,@totalWeight	-- РАСЧЕТ        -- float      Общий вес груза, кг.   -- РАСЧЕТ = вес * кол-во
    ,@freightName         nvarchar(256) = 'Не обязательно Характер груза' -- string  Характер груза - описание
    ,@hazardClass		  nvarchar(10)  = '0'         -- Класс опасности груза. Значение по умолчанию - "0"
    -- Оплата перевозки
    ,@paymentCity         nvarchar(max) = '2500000100000000000000000' -- Код КЛАДР города оплаты.
    ,@paymentType		  nvarchar(10)  = 'cash'      -- Вид оплаты.: "cash" - оплата наличными; / "noncash" - безналичный расчёт. - Используется для проверки


AS
BEGIN
-- ! для работы нужна постоянная таблица в базе -  [dbo].[api_DelLinSessions] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

-- Дата выполнения заказа. "ГГГГ-ММ-ЧЧ" Используется только для параметра "request.derival"
-- 23 	ISO8601 	гггг-мм-дд
IF  LEN(  ISNULL ( @derival_produceDate   , '' ) )=0
SET @derival_produceDate  =  CONVERT ( nvarchar(10) , GETDATE() , 23 )

-- РАСЧЕТ / ПЕРЕСЧЕТ
-- в 1 сантиметре 0.01 метра. Один (1) метр равен 100 см
DECLARE @length_m numeric(20,3)
SET     @length_m = @length * 0.01  -- float      Длина самого длинного грузового места, м. -- приходит   Длина (в сантиметрах)   - ПЕРЕСЧЕТ в  м  numeric(20,3)

DECLARE @width_m numeric(20,3)
SET     @width_m = @width * 0.01   -- float      Ширина самого широкого грузового места, м. -- приходит   Ширина (в сантиметрах)  - ПЕРЕСЧЕТ в  м  numeric(20,3)

DECLARE @height_m numeric(20,3)
SET     @height_m = @height * 0.01 -- float      Высота самого высокого грузового места, м. -- приходит   Высота (в сантиметрах)  - ПЕРЕСЧЕТ в  м  numeric(20,3)

-- 1 Грамм равно 0.001 Килограмма
DECLARE @weight_kg numeric(20,3)
SET     @weight_kg = @weight *  0.001 -- float      Вес самого тяжелого грузового места, кг  - приходит   Вес (грамм )	        – ПЕРЕСЧЕТ! Вес  (в килограммах) numeric(20,3)

-- умножить длину, ширину и высоту
DECLARE @totalVolume_m3 numeric(20,3)
SET     @totalVolume_m3 = @length_m * @width_m * @height_m -- float      Общий объём груза, м3. -- РАСЧЕТ

--
DECLARE @totalWeight_kg numeric(20,3)
SET     @totalWeight_kg = @weight_kg * @quantity  -- РАСЧЕТ  -- float      Общий вес груза, кг.   -- РАСЧЕТ = вес * кол-во Мест

-------------------------------------------------------------------------------------------
-- Авторизация пользователя , работа с сессией
DECLARE @DelLinAppKey 	nvarchar(max) = ''
      , @DelLinLogin 	nvarchar(max) = ''
      , @DelLinPassword nvarchar(max) = ''

-- ! НАРУШЕНИЕ ПРАВИЛ БЕЗОПАСНОСТИ ! Явно указаны параметры авторизации
SET  	@DelLinAppKey  = 'DXXXXXX-XXXX-XXXX-XXXX-69DF350E6C34'
SET     @DelLinLogin   = 'mail@yandex.ru'
SET  	@DelLinPassword= 'Dellin_test_pwd1'

-------------------------------------------------------------------------------------------
DECLARE @sessionID NVARCHAR(MAX) , @errorMsg NVARCHAR(MAX)

  -- Поиск доступной сесии для @username , берем запись последнюю по id
    SELECT TOP 1 @sessionID = ISNULL( sessionID , '')  ,  @errorMsg =  ISNULL( errorMsg , '')
    FROM   dbo.api_DelLinSessions
    WHERE  userСreator    = @username  -- сессию создал текущий пользователь
       AND DelLinAppKey   = @DelLinAppKey
       AND DelLinLogin 	  = @DelLinLogin
       AND DelLinPassword = @DelLinPassword
    ORDER BY id DESC
    -- ОТЛАДКА
	insert into as_trace ( header, text, username, code , created )   values( '@sessionID', @sessionID , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
	insert into as_trace ( header, text, username, code , created )   values( '@errorMsg' , @errorMsg  , @username, 'api_ruDelLinCalculator_request' , GETDATE() )

    IF LEN( @sessionID )=0
      BEGIN
		 -- SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
          SELECT 'Ошибка! Не определен @sessionID для @username '+ ISNULL( @username, '' ) +'. Возможная ошибка '+ ISNULL( @errorMsg, '' ) Msg, 0 Result
          RETURN
      END

     IF LEN( @errorMsg )>0
      BEGIN
		 -- SET @errorText = ' text:'+ ISNULL( @errorMsg, '' )
          SELECT 'Ошибка! При определении @sessionID='+ ISNULL(  @sessionID, '' ) +' для @username '+ ISNULL( @username, '' ) +' Возникла ошибка: '+ ISNULL(  @errorMsg, '' ) Msg, 0 Result
          RETURN
      END
-------------------------------------------------------------------------------------------
-- На данном этапе есть @sessionID
-------------------------------------------------------------------------------------------
DECLARE @apiUrl1 		nvarchar(max) = '' 		-- Финальная строка для отправки  -- ФАКТИЧЕСКИ ЭТО Url

DECLARE @jsonRequest1	nvarchar(max) = '' 	    -- текст json-объекта

SET     @apiUrl1  = 'https://api.dellin.ru/v2/calculator'

SET     @jsonRequest1 = N'{' + CHAR(10)
                      + N'"appkey": "'   + @DelLinAppKey +'",'+ CHAR(10)
                      + N'"sessionID":"' + @sessionID    +'",'+ CHAR(10)
                      + N'"delivery": '  + CHAR(10)
                      + N'{'  + CHAR(10)
                      + N'"deliveryType":{'  + CHAR(10)
                      + N'               "type":"' + @deliveryType + '"'  + CHAR(10)
                      + N'               },'  + CHAR(10)
                      -- arrival Данные по доставке груза до получателя
                      + N'"arrival":{'  + CHAR(10)
                      + N'          "variant":"'   + @arrival_variant    +'",' + CHAR(10)
                      + N'          "terminalID":"'+ @arrival_terminalID +'"'  + CHAR(10)
                      + N'          },'  + CHAR(10)
                      --  derival Данные по доставке груза от отправителя
                      + N'"derival":{'  + CHAR(10)
                      + N'          "produceDate":"'+ @derival_produceDate +'",' + CHAR(10)
                      + N'          "variant":"'    + @derival_variant     +'",' + CHAR(10)
                      + N'          "terminalID":"' + @derival_terminalID  +'"'  + CHAR(10)
                      + N'          }'  + CHAR(10)
                      + N'},'  + CHAR(10) -- закрытие секции   delivery
                      --
                      + N'"members":{'  + CHAR(10)
                      + N'          "requester":{'  + CHAR(10)
                      + N'          			"role":"'+ @requester_role +'"'  + CHAR(10)
                      + N'          			}'  + CHAR(10)
                      + N'          },'  + CHAR(10)
                      --
                      + N'"cargo":{'  + CHAR(10)  -- ЗНАЧЕНИЯ БЕЗ КАВЫЧЕК
                      + N'        "quantity":'+ TRY_CAST( @quantity AS nvarchar )  +',' + CHAR(10)
                      + N'        "length":'  + TRY_CAST( @length_m AS nvarchar )  +',' + CHAR(10)
                      + N'        "width":'   + TRY_CAST( @width_m  AS nvarchar )  +',' + CHAR(10)
                      + N'        "height":'  + TRY_CAST( @height_m AS nvarchar )  +',' + CHAR(10)
                      + N'        "weight":'  + TRY_CAST( @weight_kg AS nvarchar)  +',' + CHAR(10)
                      -- --
                      + N'        "totalVolume":'+ TRY_CAST( @totalVolume_m3 AS nvarchar )  +',' + CHAR(10)
                      + N'        "totalWeight":'+ TRY_CAST( @totalWeight_kg AS nvarchar )  +',' + CHAR(10)
                      -- --
                      + N'        "freightName":"'+ @freightName +'"'  +',' + CHAR(10)
                      + N'        "hazardClass":"'+ @hazardClass +'"'  + CHAR(10)
                      + N'},'  + CHAR(10)  -- закрытие секции  cargo
                      + N'"payment":{'  + CHAR(10)
                      + N'          "paymentCity":"'+ @paymentCity +'"' +',' +CHAR(10)
                      + N'          "type":"'       + @paymentType +'"'      + CHAR(10)
                      + N'}'  + CHAR(10)  -- закрытие секции  payment
                      + N'}'  -- Конец строки



-------------------------------------------------------------------------------------------
    -- ОТЛАДКА
	 insert into as_trace ( header, text, username, code , created )   values( 'apiUrl1'       , @apiUrl1      , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
	 insert into as_trace ( header, text, username, code , created )   values( '@jsonRequest1' , @jsonRequest1 , @username, 'api_ruDelLinCalculator_request' , GETDATE() )
-------------------------------------------------------------------------------------------
        -- SELECT 1
    	select '' Msg, 1 Result
          , @apiUrl1 Url -- (адрес, куда будет идти запрос)
          , 'application/json' ContentType -- явное указание для HEADER

	-- SELECT 2 PARAMETERS - параметры, которые будут передаваться во внешний источник
	 select 'id' name
           , @jsonRequest1 value -- это body
           , 'json' [type] -- form (в форме передается), header (в http headers), get запросы передавайте прямо в URL


END

 

Деловые линии - Калькулятор - PROCEDURE [dbo].[api_ruDelLinCalculator_response]

Результат запроса может быть как сообщение с информацией, так и сообщение с ошибкой.

Список возможных сообщений об ошибках.

  1.  'Ошибка! Строка @response не является JSON!' -  (Проверка ответа оператором ISJSON() ).
  2.  'Ошибка! Запрос @response вернул ошибку! '@errorText1 – в ответе JSON есть строка errors.
  3.  'Ошибка! Запрос @response вернул ошибку! ' @errorCode0    @errortitle0   @errordetail0 -  в ответе JSON есть массив данных с перечнем ошибок, содержащий поля Code / title / detail.

  

Если ошибок в ответе не обнаружено, из ответа выбираются такие данные: 

  • Статус - Эмуляция http-кода состояния.

В случае успешного выполнения возвращается код "200" (OK) /- ошибка код 400

  • Данные по доставке груза от отправителя – Имя терминала отправителя
  • Данные по доставке груза до получателя– Имя терминала получателя
  • Итоговая стоимость для выбранного вида перевозки
  • Дата отправки с терминала-отправителя
  • Дата прибытия на терминал-получатель
  • Дата и время, с которого груз готов к выдаче на терминале

Пример текста – результат: "(Статус: 200) Доставка: Владивосток - Москва. Сумма: 1304.0. Дата отправки: 2020-06-05. Будет готов к выдаче: 2020-06-17 09:00:00. "

CREATE PROCEDURE [dbo].[api_ruDelLinCalculator_response]
	@response nvarchar(max),
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2 - те же что и на request)

	@username nvarchar(32)
AS
BEGIN
	-- ОТЛАДКА
	-- ответ слишком длинная строка - /api/req/ruDelLinCalculator (/asapi): String or binary data would be truncated.
    -- LEN( @response ) = 3386
    -- insert into as_trace (text, username, code , created  ) values( TRY_CAST ( LEN( @response ) AS nvarchar) , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
    insert into as_trace (header , text, username, code , created  ) values( '1    , 1024',  SUBSTRING ( @response , 1    , 1024 )  , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
    insert into as_trace (header , text, username, code , created  ) values( '1025 , 1024',  SUBSTRING ( @response , 1025 , 1024 )  , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
    insert into as_trace (header , text, username, code , created  ) values( '2049 , 1024',  SUBSTRING ( @response , 2049 , 1024 )  , @username, 'api_ruDelLinCalculator_response' , GETDATE() )
    insert into as_trace (header , text, username, code , created  ) values( '3073 , 1024',  SUBSTRING ( @response , 3073 , 1024 )  , @username, 'api_ruDelLinCalculator_response' , GETDATE() )


    DECLARE @json1 NVARCHAR(MAX)  = N''
	SET @json1 = @response

    -- Для проверки правильности JSON формата существует функция ISJSON, которая возвращает 1, если это JSON, 0 — если нет и NULL, если был передан NULL
    DECLARE @presentJSON bit = 0
    SELECT @presentJSON = ISNULL( ISJSON( @json1 ) , 0 )

    IF @presentJSON <> 1
    BEGIN
        SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        RETURN
    END

	-- Обработка ошибки в ответе
    DECLARE @presentError1 bit = 0 , @errorText1 NVARCHAR(MAX)
	--
	, @presentError2 bit = 0
	, @errorCode0 NVARCHAR(MAX), @errortitle0 NVARCHAR(MAX) , @errordetail0 NVARCHAR(MAX)
	, @errorCode1 NVARCHAR(MAX), @errortitle1 NVARCHAR(MAX) , @errordetail1 NVARCHAR(MAX)
	, @errorCode2 NVARCHAR(MAX), @errortitle2 NVARCHAR(MAX) , @errordetail2 NVARCHAR(MAX)
	-- Данные
	, @statust NVARCHAR(MAX) -- Эмуляция http-кода состояния. В случае успешного выполнения возвращается код "200" (OK)
	                         -- ошибка код 400
	, @derival_terminal NVARCHAR(MAX) -- Данные по доставке груза от отправителя
	, @arrival_terminal NVARCHAR(MAX) -- Данные по доставке груза до получателя
	, @price			NVARCHAR(MAX) -- Итоговая стоимость для выбранного вида перевозки

	, @derivalFromOspSender   NVARCHAR(MAX) -- Дата отправки с терминала-отправителя
	, @arrivalToOspReceiver	  NVARCHAR(MAX) -- Дата прибытия на терминал-получатель
	, @giveoutFromOspReceiver NVARCHAR(MAX) -- Дата и время, с которого груз готов к выдаче на терминале

   SELECT    @presentError1 = IIF( JSON_VALUE( @json1, '$.errors') IS NULL  , 0 , 1 )  -- Проверка массива JSON_QUERY  '$.error[0]'
           , @errorText1    = JSON_VALUE( @json1, '$.errors')
	       --
	       , @presentError2    = IIF( JSON_QUERY( @json1, '$.errors[0]') IS NULL  , 0 , 1 )
           , @errorCode0   = JSON_VALUE( @json1, '$.errors[0].code')
           , @errortitle0  = JSON_VALUE( @json1, '$.errors[0].title')
           , @errordetail0 = JSON_VALUE( @json1, '$.errors[0].detail')
		   --
           , @errorCode1   = JSON_VALUE( @json1, '$.errors[1].code')
           , @errortitle1  = JSON_VALUE( @json1, '$.errors[1].title')
           , @errordetail1 = JSON_VALUE( @json1, '$.errors[1].detail')
		   --
           , @errorCode2   = JSON_VALUE( @json1, '$.errors[2].code')
           , @errortitle2  = JSON_VALUE( @json1, '$.errors[2].title')
           , @errordetail2 = JSON_VALUE( @json1, '$.errors[2].detail')
           -- Данные
           , @statust          = JSON_VALUE( @json1, '$.metadata.status')
		   , @derival_terminal = JSON_VALUE( @json1, '$.data.derival.terminal') -- Данные по доставке груза от отправителя
		   , @arrival_terminal = JSON_VALUE( @json1, '$.data.arrival.terminal') -- Данные по доставке груза до получателя
		   , @price            = JSON_VALUE( @json1, '$.data.price')			-- Итоговая стоимость для выбранного вида перевозки

		   , @derivalFromOspSender    = JSON_VALUE( @json1, '$.data.orderDates.derivalFromOspSender')   -- Дата отправки с терминала-отправителя
		   , @arrivalToOspReceiver	  = JSON_VALUE( @json1, '$.data.orderDates.arrivalToOspReceiver')   -- Дата прибытия на терминал-получатель
		   , @giveoutFromOspReceiver  = JSON_VALUE( @json1, '$.data.orderDates.giveoutFromOspReceiver') -- Дата и время, с которого груз готов к выдаче на терминале


      IF @presentError1 = 1
      BEGIN
          SELECT 'Ошибка! Запрос @response вернул ошибку! '+ ISNULL( @errorText1, '' ) Msg, 0 Result, @response Response
          RETURN
      END

      IF @presentError2 = 1
      BEGIN
          SELECT 'Ошибка! Запрос @response вернул ошибку! '
		        + IIF( @errorCode0 IS NULL  , '' , ' code:'+ @errorCode0 + ' title:' +  @errortitle0 + ' detail:' + @errordetail0  )
		        + IIF( @errorCode1 IS NULL  , '' , ' code:'+ @errorCode1 + ' title:' +  @errortitle1 + ' detail:' + @errordetail1  )
		        + IIF( @errorCode2 IS NULL  , '' , ' code:'+ @errorCode2 + ' title:' +  @errortitle2 + ' detail:' + @errordetail2  )
				AS Msg
		  , 0 Result, @response Response
          RETURN
      END

     DECLARE @deliveryText NVARCHAR(MAX)
    --
	SET @deliveryText = '(Статус: '+ @statust +') Доставка: '+ ISNULL( @derival_terminal, '' ) + ' - ' + ISNULL( @arrival_terminal , '' ) +'. '
					   +'Сумма: '  + ISNULL( @price, '' )+'. '
					   +'Дата отправки: ' + ISNULL( @derivalFromOspSender, '' )
					   +'. Будет готов к выдаче: '+ISNULL( @giveoutFromOspReceiver, '' )+'. '




	-- SELECT 1
	select @deliveryText as Msg, 1 Result, @response Response

	-- SELECT 2 Внешние действия

END

Falcon Space - функциональная веб-платформа разработки на узком стеке MS SQL/Bootstrap. Вводная по Falcon Space
Насколько полезной была статья?

Google поиск по нашей документации

Нужна бесплатная консультация?
Планируете делать веб-проект?
Если видео Youtube плохо грузится, то попробуйте найти видео в ВК видео на канале Falcon Space
Сайт использует Cookie. Правила конфиденциальности OK
Подождите...