Интеграция API Почта РФ

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

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

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

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

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

 

Почта РФ с авторизацией - otpravka.pochta.ru (обзор)

Для начала работы необходимо зарегистрироваться - https://passport.pochta.ru.

API Онлайн-сервиса «Отправка» - Основная информация - https://otpravka.pochta.ru/specification#/main

Взаимодействие посредством REST запросов.

Запросы и ответы сервиса используют JSON текстовый формат.

 

Для интеграции с API Онлайн-сервиса «Отправка» необходимо располагать:

  •     токеном авторизации приложения;
  •     ключом авторизации пользователя.

 

Ключ авторизации пользователя - генерируется с помощью алгоритма base64 - https://otpravka.pochta.ru/specification#/authorization-key

 

Токен можно узнать в настройках личного кабинета - https://otpravka.pochta.ru/settings#/api-settings

Для работы с данным сервисом и получения токена необходим договор с Почтой России!

Далее это способ не рассматривается.

Почта РФ без авторизации

Если у Вас нет договора и доступа к api используйте эти два сервиса от Почты России. 

Расчет сроков доставки -  https://delivery.pochta.ru/#/calcmail/910

Расчет стоимости доставки - https://tariff.pochta.ru/#/calcmail/101

 

Почта РФ тарифы - Стоимость - PROCEDURE [api_ruPostTariff_request]

Автоматический расчет стоимости почтовых отправлений и услуг с помощью сервиса тарификации

Сайт: https://tariff.pochta.ru/#/calcmail/101

Документация: https://tariff.pochta.ru/TariffAPI.pdf?367

Для получения расчета клиент отправляет на сервер REST-запрос методом GET

 

Параметры запроса

 

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

Переменная

Тип

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

Описание

Примечание

1

@resultType

nvarchar(32)

'Json'

Формат запрашиваемых данных

Json - тип результата

2

@codeObject

nvarchar(32)

'47030'

Тип (код) объекта почтовой тарификации, см. Приложение 1

47030 - Посылка 1 класса – (ПРИМЕР c6v.ru)

27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

3

@indexFrom

nvarchar(32)

'101000'

Индекс места отправления

101000 "МОСКВА"

4

@doorFrom

bit

 0

Флаг - от двери

 ПОКА НЕ ИСПОЛЬЗУЕТСЯ

5

@indexTo

nvarchar(32)

'690000 '

Индекс места назначения

108803 "ВОСКРЕСЕНСКОЕ"

- Владивосток

6

@doorTo

bit

0

Флаг - до двери

 ПОКА НЕ ИСПОЛЬЗУЕТСЯ

 

вес / габариты

7

@weight

nvarchar(32)

'100'

Вес

(пока считать в граммах)

8

@length    

nvarchar(32)

'10'

Длина, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

9

@width     

nvarchar(32)

'10'

Ширина, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

10

@height    

nvarchar(32)

'10'

Высота, см

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

11

@pack      

nvarchar(32)

'10'

Тип упаковки

Возможные значения см. в Приложении 3

10 - Коробка «S»

12

@operDate  

nvarchar(8)

 

Дата тарификации YYYYMMDD

Если дата не указана, принимается значение текущей даты

 

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

13

size

nvarchar(max)

 

Размер отправления (см).

Указывается 3 целочисленных значения, разделенные знаком “x”, например, size=100x50x25.

ПОКА НЕ ИСПОЛЬЗУЕТСЯ

  

Индексы

  • 101000 - МОСКВА
  • 344000 - Ростов
  • 163000- Архангельск
  • 690000 - Владивосток

Замечание 1. В зависимости от Кода объекта тарификации набор входных параметров может меняться.

 

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

 https://tariff.pochta.ru/tariff/v1/calculate?Json&object=47030&from=101000&to=690000&weight=100&pack=10&date=20200603

 

Примечание. Фактически в этом запросе передается только URL. Тела запроса body – нет, SELECT2 не используется.

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

{
    "version": "1.13.3.390",
    "place": "C5-6",
    "id": 47030,
    "name": "Посылка 1 класса",
    "typ": 47,
    "cat": 3,
    "dir": 0,
    "from": 101000,
    "to": 690000,
    "weight": 100,
    "date": 20200603,
    "time": 0,
    "date-first": 20200101,
    "postoffice": [
        {
            "index": 101000,
            "tp": 1,
            "name": "МОСКВА",
            "region": 1000000001045,
            "regid": 77,
            "place": 1000000001045,
            "parent": 127950,
            "type": 3,
            "pvz": 1,
            "item-check-men": 1,
            "item-check-view": 1,
            "move": 1,
            "pack-max": 99
        },
        {
            "index": 690000,
            "tp": 2,
            "name": "ВЛАДИВОСТОК ПОЧТАМТ",
            "region": 1005,
            "regid": 25,
            "place": 1000000031441,
            "parent": 690700,
            "type": 15
        }
    ],
    "trans": 3,
    "transid": 2,
    "transname": "авиа",
    "tariff": [
        {
            "id": "2556",
            "name": "Плата за пересылку посылки 1 класса",
            "steps": [
                {
                    "name": "Доставка из группы 1 по зоне 2",
                    "route": [
                        2556,
                        "1",
                        "2",
                        "100"
                    ],
                    "v": 14417,
                    "id": "2556-1-2-100"
                }
            ],
            "fromi": 101000,
            "from": "МОСКВА",
            "toi": 690000,
            "to": "ВЛАДИВОСТОК ПОЧТАМТ",
            "ground": {
                "val": 14417,
                "valnds": 17300,
                "ndsrate": 20.0
            }
        }
    ],
    "ground": {
        "val": 14417,
        "valnds": 17300
    },
    "pay": 14417,
    "paynds": 17300,
    "ndsrate": 20,
    "nds": 2883,
    "typcatname": "Посылка 1 класса",
    "now": "20200603T202514"
}

 

CREATE PROCEDURE [dbo].[api_ruPostTariff_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
    --  API ЗАПРОС - КЛЮЧИ  Исходные данные:
    ,@resultType nvarchar(32) = 'Json' 		-- Json		тип результата
	,@codeObject nvarchar(32) = '47030'  	-- Код объекта тарификации
    										-- 47030 - Посылка 1 класса -- ПРИМЕР c6v.ru
											-- 27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

	,@indexFrom	nvarchar(32) = '101000'   	-- Индекс места отправления -- 101000 "МОСКВА".
	,@doorFrom  bit = 0 					-- Флаг - от двери -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ

	,@indexTo   nvarchar(32) = '690000'   	-- Индекс места назначения -- 108803 "ВОСКРЕСЕНСКОЕ". -- 690000 - Владивосток
	,@doorTo   	bit = 0 					-- Флаг - до двери -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
	-- вес / габариты
	,@weight     nvarchar(32) = '100'   	-- Вес (грамм / кг ) -- Указывается в граммах или килограммах, в зависимости от объекта тарификации, см. Приложение 1
											-- пока считать в граммах
    -- Размер -- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
	,@length     nvarchar(32) = '10'   		-- Длина, см
	,@width      nvarchar(32) = '10'   		-- Ширина, см
	,@height     nvarchar(32) = '10'   		-- Высота, см

	,@pack       nvarchar(32) = '10'   		-- Упаковка
    ,@operDate   nvarchar(8)  = ''          --'20200527'  -- Дата тарификации YYYYMMDD -- Если дата не указана, принимается значение текущей даты

AS
BEGIN

-- Дата тарификации YYYYMMDD -- Если дата не указана, принимается значение текущей даты
-- 112 = ггггммдд --'20200527'
IF  LEN(  ISNULL ( @operDate   , '' ) )=0
SET @operDate  =  CONVERT ( nvarchar(8) , GETDATE() , 112 )
-- exec as_print @str = @operDate


DECLARE @apiUrl 		nvarchar(max) = '' 		-- Финальная строка для отправки -- @apiStr -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @apiCommomStr 	nvarchar(max) = '' 	    -- Общая часть для всех запросов
SET     @apiCommomStr   = 'https://tariff.pochta.ru/tariff/v1/calculate?' -- ? знак в конце Обязательно

-- size Строка Размер отправления (см). Указывается 3 целочисленных значения, разделенные знаком “x”, например, size=100x50x25. Возможные значения: 1–1000
-- формируется по вх.парам
-- ПРИМЕР c6v.ru -- ПОКА НЕ ИСПОЛЬЗУЕТСЯ
DECLARE @size nvarchar(max) = ''
SET     @size =  @length + 'x' + @width + 'x' + @height
-- exec as_print @str=@size

SET  @apiUrl  = @apiUrl + @apiCommomStr
                        + @resultType
                        + IIF ( LEN(  ISNULL ( @codeObject , '' ) )>0, '&object=' + @codeObject, '' )
                        + IIF ( LEN(  ISNULL ( @indexFrom  , '' ) )>0, '&from=' + @indexFrom, '' )
                        + IIF ( LEN(  ISNULL ( @indexTo    , '' ) )>0, '&to=' + @indexTo, '' )
                        + IIF ( LEN(  ISNULL ( @weight     , '' ) )>0, '&weight=' + @weight, '' )
                        + IIF ( LEN(  ISNULL ( @pack       , '' ) )>0, '&pack=' + @pack, '' )
                        + IIF ( LEN(  ISNULL ( @operDate   , '' ) )>0, '&date=' + @operDate, '' )


    -- ОТЛАДКА
	insert into as_trace (text, username, code , created )   values( @apiUrl , @username, 'api_ruPostTariff_request' , GETDATE() )

    -- ПРАВИЛЬНАЯ СТРОКА
    -- select '' Msg, 1 Result, 'https://tariff.pochta.ru/tariff/v1/calculate?json&object=27030&from=101000&to=108803&weight=1000&pack=10&date=20200527' Url
    -- ФАКТИЧЕСКИ ВЕСЬ ЗАПРОС ОТПРАВЛЯЕСТ В Url
    select '' Msg, 1 Result, @apiUrl AS Url

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

Почта РФ тарифы - Стоимость - PROCEDURE [api_ruPostTariff_response]

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

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

  1.  'Ошибка! Строка @response не является JSON!' (Проверка ответа оператором ISJSON() )
  2.  'Ошибка! Запрос @response вернул ошибку! '… @errorText.

Пример текста ответа – response – с ошибкой.

{
    "caption": "Ошибки тарификации",
    "version": "1.13.3.390",
    "error": [
        "Не указан объект тарификации в параметре object. (1301)"
    ],
    "errors": [
        {
            "msg": "Не указан объект тарификации в параметре object.",
            "code": 1301
        }
    ]
}

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

  • Итого сумма без НДС
  • Итого сумма с НДС
  • Ставка НДС %
  • Сумма НДС
  • Название операции
  • Дата и Время выполнения

Пример текста – результат: "Операция: Посылка 1 класса Итого сумма без НДС: 144.71 руб. Итого НДС ( Ставка 20% ):28.38 руб. Итого сумма с НДС: 173.00 руб."

PROCEDURE [dbo].[api_ruPostTariff_response]

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

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostTariff_response'
	insert into as_trace (text, username, code , created) values(@response, @username, 'api_ruPostTariff_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 )
    -- SELECT @presentJSON
    IF @presentJSON <> 1
    BEGIN
        SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        RETURN
    END


    -- Обработка ошибки в ответе
    DECLARE @presentError bit = 0, @errorText NVARCHAR(MAX), @errorCode NVARCHAR(MAX), @errorMsg NVARCHAR(MAX)
    -- ошибка
    -- https://tariff.pochta.ru/tariff/v1/calculate?Json&27030&101000&108803&1000&10&20200527
    -- {"caption": "Ошибки тарификации","version": "1.12.19.385","error": ["Не указан объект тарификации в параметре object. (1301)"],"errors": [{"msg":"Не указан объект тарификации в параметре object.","code":1301}]}

	DECLARE @pay		NVARCHAR(MAX) -- Итого сумма без НДС
          , @paynds		NVARCHAR(MAX) -- Итого сумма с НДС
          , @ndsrate	NVARCHAR(MAX) -- Ставка НДС %
          , @nds		NVARCHAR(MAX) -- Сумма НДС
          , @typcatname NVARCHAR(MAX) -- Название операции
          , @now		NVARCHAR(MAX) -- Дата и Время выполнения

	-- Чтобы извлечь скалярное значение из JSON, можно воспользоваться функцией JSON_VALUE:
      SELECT @presentError = IIF( JSON_VALUE( @json1, '$.error[0]') IS NULL  , 0 , 1 )
           , @errorText    = JSON_VALUE( @json1, '$.error[0]')
           , @errorCode    = JSON_VALUE( @json1, '$.errors[0].code')
           , @errorMsg     = JSON_VALUE( @json1, '$.errors[0].msg')
           -- Данные
           , @pay 			= JSON_VALUE( @json1, '$.pay')
           , @paynds 		= JSON_VALUE( @json1, '$.paynds')
           , @ndsrate 		= JSON_VALUE( @json1, '$.ndsrate')
           , @nds 			= JSON_VALUE( @json1, '$.nds')
           , @typcatname 	= JSON_VALUE( @json1, '$.typcatname')
           , @now 			= JSON_VALUE( @json1, '$.now')


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

	 DECLARE @payInt		NVARCHAR(MAX) -- Итого сумма без НДС -- Целое
          , @payDecimal		NVARCHAR(MAX) -- Итого сумма без НДС -- дробное
          , @payndsInt		NVARCHAR(MAX) -- Итого сумма с НДС -- Целое
          , @payndsDecimal	NVARCHAR(MAX) -- Итого сумма с НДС -- дробное
          , @ndsInt			NVARCHAR(MAX) -- Сумма НДС -- Целое
          , @ndsDecimal		NVARCHAR(MAX) -- Сумма НДС -- дробное

    SELECT @payInt        = ISNULL( SUBSTRING ( @pay , 1 , LEN(@pay) - 2 )		, '' )
         , @payDecimal    = ISNULL( SUBSTRING ( REVERSE( @pay ), 1 ,2 )			, '' )
         , @payndsInt     = ISNULL( SUBSTRING ( @paynds , 1 , LEN(@paynds) - 2 ), '' )
         , @payndsDecimal = ISNULL( SUBSTRING ( REVERSE( @paynds ), 1 ,2 )		, '' )
         , @ndsInt        = ISNULL( SUBSTRING ( @nds , 1 , LEN(@nds) - 2 )		, '' )
         , @ndsDecimal    = ISNULL( SUBSTRING ( REVERSE( @nds ), 1 ,2 )			, '' )


	-- SELECT 1
	select 'Операция: '+ ISNULL( @typcatname, '' )
         + ' Итого сумма без НДС: '+ ISNULL( @payInt, '' )  + '.'    + ISNULL( @payDecimal, '' ) +' руб.'
         + ' Итого НДС ( Ставка '  + ISNULL( @ndsrate, '' ) +'% ):'  + ISNULL( @ndsInt, '' )  + '.'  + ISNULL( @ndsDecimal, '' ) +' руб.'
         + ' Итого сумма с НДС: '  + ISNULL( @payndsInt , '' ) + '.' + ISNULL( @payndsDecimal, '' ) +' руб.' AS Msg --
          , 1 Result , @response Response


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

END

Почта РФ - Сроки Доставки - PROCEDURE [api_ruPostDelivery_request]

 Автоматический расчет нормативных сроков доставки почтовых отправлений.

Сайт: https://delivery.pochta.ru/#/calcmail/913

Документация:  https://delivery.pochta.ru/delivery_api.pdf?176

 

Для получения расчета клиент отправляет на сервер REST-запрос методом GET

Параметры запроса

 

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

Переменная

Тип

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

Описание

Примечание

1

@resultType

nvarchar(32)

'Json'

Формат запрашиваемых данных

Json - тип результата

2

@codeObject

nvarchar(32)

'47030'

Тип (код) объекта почтовой тарификации, см. Приложение 1

47030 - Посылка 1 класса – 

27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

3

@indexFrom

nvarchar(32)

'101000'

Индекс места отправления

101000 "МОСКВА"

4

@indexTo

nvarchar(32)

'690000 '

Индекс места назначения

108803 "ВОСКРЕСЕНСКОЕ"

- Владивосток

5

@operDate  

nvarchar(8)

 

Дата тарификации YYYYMMDD

Если дата не указана, принимается значение текущей даты

 

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

https://delivery.pochta.ru/delivery/v1/calculate?Json&object=47030&from=101000&to=690000&date=20200603

Примечание. Фактически в этом запросе передается только URL. Тела запроса body – нет, SELECT2 не используется.

 

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

{
    "version": "1.13.3.390",
    "place": "D_21",
    "id": 47030,
    "name": "Посылка 1 класса",
    "typ": 47,
    "cat": 3,
    "dir": 0,
    "from": 101000,
    "to": 690000,
    "date": 20200603,
    "time": 0,
    "date": 20200603,
    "time": 0,
    "date-first": 20200218,
    "postoffice": [

        {
            "index": 101000,
            "tp": 1,
            "name": "МОСКВА",
            "region": 1000000001045,
            "regid": 77,
            "place": 1000000001045,
            "parent": 127950,
            "type": 3,
            "pvz": 1,
            "item-check-men": 1,
            "item-check-view": 1,
            "move": 1,
            "pack-max": 99
        },
        {
            "index": 690000,
            "tp": 2,
            "name": "ВЛАДИВОСТОК ПОЧТАМТ",
            "region": 1005,
            "regid": 25,
            "place": 1000000031441,
            "parent": 690700,
            "type": 15
        }
    ],
    "tariff": [
        {
            "id": "5072",
            "name": "Нормативный срок доставки отправлений 1 класса",
            "steps": [
                {
                    "name": "Прямая между населенными пунктами",
                    "route": [
                        "5072",
                        "45000000",
                        "5701000001"
                    ],
                    "z": 4,
                    "id": "5072-45000000-5701000001"
                }
            ],
            "fromi": 101000,
            "from": "МОСКВА",
            "toi": 690000,
            "to": "ВЛАДИВОСТОК ПОЧТАМТ",
            "delivery": {
                "min": 2,
                "max": 4
            }
        }
    ],
    "delivery": {
        "min": 2,
        "max": 4
    },
    "typcatname": "Посылка 1 класса",
    "now": "20200603T204906"
}

CREATE PROCEDURE [dbo].[api_ruPostDelivery_request]
	@parameters ExtendedDictionaryParameter READONLY,  -- входящие параметры для внутренней обработки (используйте Key, Value2)
	@username nvarchar(32)  -- текущий пользователь.
    --
    ,@resultType nvarchar(32) = 'Json' 		-- Json		тип результата
	,@codeObject nvarchar(32) = '47030'  	-- Код объекта тарификации
    										-- 47030 - Посылка 1 класса -- ПРИМЕР c6v.ru
											-- 27030 - Посылка (частное лицо или предприятие) - Посылка стандарт

	,@indexFrom	nvarchar(32) = '101000'   	-- Индекс места отправления -- 101000 "МОСКВА".

	,@indexTo   nvarchar(32) = '690000'   	-- Индекс места назначения -- 108803 "ВОСКРЕСЕНСКОЕ". -- владивосток 690000

    ,@operDate   nvarchar(8)  = ''          --'20200527'  -- Дата тарификации YYYYMMDD
    										-- Дату необходимо указывать по местному времени.Если дата не указана–принимаетсязначение текущей датыпо московскому времени

AS
BEGIN

-- Дата тарификации YYYYMMDD
-- Дату необходимо указывать по местному времени.Если дата не указана–принимаетсязначение текущей датыпо московскому времени
-- 112 = ггггммдд --'20200527'
IF  LEN(  ISNULL ( @operDate   , '' ) )=0
SET @operDate  =  CONVERT ( nvarchar(8) , GETDATE() , 112 )
-- exec as_print @str = @operDate

DECLARE @apiUrl 		nvarchar(max) = '' 		-- Финальная строка для отправки -- @apiStr -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @apiCommomStr 	nvarchar(max) = '' 	    -- Общая часть для всех запросов
SET     @apiCommomStr   = 'https://delivery.pochta.ru/delivery/v1/calculate?' -- ? знак в конце Обязательно

SET  @apiUrl  = @apiUrl + @apiCommomStr
                        + @resultType
                        + IIF ( LEN(  ISNULL ( @codeObject , '' ) )>0, '&object=' + @codeObject, '' )
                        + IIF ( LEN(  ISNULL ( @indexFrom  , '' ) )>0, '&from=' + @indexFrom, '' )
                        + IIF ( LEN(  ISNULL ( @indexTo    , '' ) )>0, '&to=' + @indexTo, '' )
                        + IIF ( LEN(  ISNULL ( @operDate   , '' ) )>0, '&date=' + @operDate, '' )


    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostTariff_request'
	insert into as_trace (text, username, code , created )   values( @apiUrl , @username, 'api_ruPostDelivery_request' , GETDATE() )
    -- ФАКТИЧЕСКИ ВЕСЬ ЗАПРОС ОТПРАВЛЯЕСТ В Url
    select '' Msg, 1 Result, @apiUrl AS Url


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

Почта РФ - Сроки Доставки - PROCEDURE [api_ruPostDelivery_response]

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

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

  1. 'Ошибка! Строка @response не является JSON!' (Проверка ответа оператором ISJSON() )
  2. 'Ошибка! Запрос @response вернул ошибку! '… @errorText.

 

Пример текста ответа – response – с ошибкой

{
    "caption": "Ошибки тарификации",
    "version": "1.13.3.390",
    "data": {
        "id": 47030,
        "typ": 47,
        "cat": 3,
        "dir": 0,
        "name": "Посылка 1 класса",
        "seq": 47030,
        "date": 20200603,
        "date-first": 20200218
    },
    "error": [
        "Неверное значение параметра \"Индекс места назначения\" (to). значение \"6900001111\" не является параметром почтового объекта. (1301)"
    ],
    "errors": [
        {
            "msg": "Неверное значение параметра \"Индекс места назначения\" (to). значение \"6900001111\" не является параметром почтового объекта.",
            "code": 1301
        }
    ]
}

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

  •  Минимальное нормативное количество дней доставки отправления
  •  Максимальное нормативное количество дней доставки отправления
  •  Название операции
  •  Дата и Время выполнения

  

Пример текста – результат: "Операция: Посылка 1 класса Срок доставки: от 2 до 4 дней."

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

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
    -- exec as_print @str='api_ruPostDelivery_response'
	insert into as_trace (text, username, code , created  ) values(@response, @username, 'api_ruPostDelivery_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 )
    -- SELECT @presentJSON
    IF @presentJSON <> 1
    BEGIN
        SELECT 'Ошибка! Строка @response не является JSON!' Msg, 0 Result, @response Response
        RETURN
    END

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

	DECLARE  @typcatname NVARCHAR(MAX) -- Название операции
           , @now		NVARCHAR(MAX) -- Дата и Время выполнения
           --
    DECLARE @deliveryDaysMin NVARCHAR(MAX)
	DECLARE @deliveryDaysMax NVARCHAR(MAX)

	-- Чтобы извлечь скалярное значение из JSON, можно воспользоваться функцией JSON_VALUE:
    SELECT @presentError = IIF( JSON_VALUE( @json1, '$.error[0]') IS NULL  , 0 , 1 )
           , @errorText    = JSON_VALUE( @json1, '$.error[0]')
           , @errorCode    = JSON_VALUE( @json1, '$.errors[0].code')
           , @errorMsg     = JSON_VALUE( @json1, '$.errors[0].msg')
           -- Данные
           , @typcatname 	= JSON_VALUE( @json1, '$.typcatname')
           , @now 			= JSON_VALUE( @json1, '$.now')
           , @deliveryDaysMin = JSON_VALUE( @json1, '$.delivery.min')
	 	   , @deliveryDaysMax = JSON_VALUE( @json1, '$.delivery.max')

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

    DECLARE @deliveryText NVARCHAR(MAX)
    -- Срок доставки: от 2 до 4 дней.
    IF ISNULL( @deliveryDaysMin, '' ) <> ISNULL( @deliveryDaysMax, '' ) SET @deliveryText = 'Срок доставки: от ' + ISNULL( @deliveryDaysMin, '' )+' до '+ISNULL( @deliveryDaysMax, '' )+' дней.'
    IF ISNULL( @deliveryDaysMin, '' )  = ISNULL( @deliveryDaysMax, '' ) SET @deliveryText = 'Срок доставки: ' + ISNULL( @deliveryDaysMin, '' )+' дней.'

	-- SELECT 1
	select 'Операция: '+ ISNULL( @typcatname, '' ) +' '+ @deliveryText AS  Msg
          , 1 Result, @response Response

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

END

Платформа Falcon Space

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

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

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

по ходу эксплуатации программы

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

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

Бесплатное обучение разработке на Falcon Space

Вы можете разрабатывать самостоятельно или сотрудничать с нами в плане веб-разработки на платформе Falcon Space.
Примечание