Интеграция 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

В 2-3 раза экономнее и быстрее, чем заказная разработка
Более гибкая, чем коробочные решения и облачные сервисы
Используйте готовые решения и изменяйте под свои потребности
Нужна бесплатная консультация?
Планируете делать веб-проект?
Сайт использует Cookie. Правила конфиденциальности OK