Интеграция API DaData.ru подсказки по адресам

Полная документация - API подсказки по адресам - https://dadata.ru/api/suggest/address/

Сервис DaData.ru (https://dadata.ru/suggestions/) предоставляет API поиска.

Ищет адреса по любой части адреса от региона до дома («тверская нижний 12» → «Нижегородская обл, г Нижний Новгород, ул Тверская, д 12»).

Также ищет по почтовому индексу («105568» → «г Москва, ул Магнитогорская»).

Регистрация.

Нужно зарегистрироваться и подтвердить почту.

Регистрация  - https://dadata.ru/suggestions/usage/address/#registration_popup

Подтвердить адрес электронной почты.

API начнет работать после подтверждения.

После регистрации в личном кабинете  https://dadata.ru/profile/#info  станут доступны API-ключ и Секретный ключ для стандартизации.

Подписка:Тариф «Бесплатный», действует бессрочно. Возможности - Бесплатно до 10 тысяч запросов в день.

API запрос.

Формат запроса.

  • URL - https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address.
  • Метод – post.
  • Формат – json.
  • Кодировка -  UTF-8.
  • Content-Type –  application/json.
  • Accept –  application/json.
  • Authorization - Token 1d01d91d91d91d91d9f1d91d9_____ - API-ключ из личного кабинета.

 Тело запроса (формат json): 

{ "query": "москва серпуховская", "count": 20 }

query - Текст запроса (обязательный)

count - Количество результатов (максимум — 20) (не обязательный).

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

AS
BEGIN
DECLARE @queryCount nvarchar(2) = 20 		-- Количество результатов (максимум — 20)
SELECT  @queryCount = ISNULL( Value2 , '20' )  FROM @parameters WHERE [Key] = 'queryCount'
IF LEN( ISNULL( @queryCount , '20' ) ) = 0
	SET @queryCount = N'20'

DECLARE @queryStr nvarchar(max)
-- получение значений полей формы из @parameters
SELECT  @queryStr  =  ISNULL( Value2 , '' )  FROM @parameters WHERE [Key] = 'queryStr'

IF LEN( ISNULL( @queryStr , '' ) ) = 0
	SET @queryStr = N'москва серпуховская'
-- для тестирования
-- SET @queryStr = N'москва серпуховская' -- @queryStr = N'москва хабар' -- Текст запроса

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

SET     @apiUrl1  = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address'

-- для тестирования -- SET     @jsonRequest1 = N'{ "query": "москва серпуховская", "count": 20 }'
--
SET     @jsonRequest1 = N'{ "query": "'+ ISNULL( @queryStr, '' ) +'", "count": '+ TRY_CAST( ISNULL( @queryCount, '' )  AS nvarchar ) + ' }'

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

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

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


END

В ответе на запрос приходит объект с массивом подсказок в поле suggestions.

Пример ответа (с сокращениями).

{
    "suggestions": [
        {
            "value": "г Москва, ул Хабаровская",
            "unrestricted_value": "г Москва, ул Хабаровская",
            "data": {
                "postal_code": null,
                "country": "Россия",
                "country_iso_code": "RU",
                "federal_district": null,
                "region_fias_id": "0c5b2444-70a0-4932-980c-b4dc0d3f02b5",
            }
        },
        ...
    ]
}

В результате разбора ответа процедура возвращает такой результат:

Запрос: тверская нижний 12
Результаты запроса: Регион: [Нижегородская обл][Тверская обл].
Найдено уникальных почт.индексов - 2.
Адресов - 3.

Адрес

Индекс

Тверская обл, Старицкий р-н, деревня Нижний Спасс, д 12

171372

Тверская обл, Старицкий р-н, деревня Нижний Спасс, д 12 стр 12

171372

г Нижний Новгород, ул Тверская, д 12

603105

Примечание. В процедуре парсинга выводиться только три поля Адрес, Индекс, Регион.

В ответе сервиса – по одному адресу – более 70 полей, можно получить максимально подробную информацию по каждому адресу, включая значения всех классификаторов.

Процедура response - [dbo].[api_daDataAddress_response] - доступна по ссылке.

Примечание