Интеграция 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 поиск по нашей документации

Falcon Space

Это снижение стоимости владения

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

Это быстрое внесение изменений

по ходу эксплуатации программы. Как создается функционал на платформе

Это простой удобный интерфейс

адаптация под мобильные устройства. Про юзабилити платформы

Нужна бесплатная консультация?
Получить оценку проекта
Создайте концепцию проекта на основе нашего шаблона и получите оценку проекта в виде КП.
Демо-сайт решений
Базисные решения, которые можно гибко адаптировать под себя: менять внешний вид, бизнес-логику и даже структуру базы данных.
Сайт использует Cookie. Правила конфиденциальности OK