Интеграция API DaData.ru Город по IP-адресу

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

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

Определяет город по IP-адресу в России.

Поддерживает как IPv4, так и IPv6 адреса.

Возвращает детальную информацию о городе, в том числе почтовый индекс.

Недостатки: работает только по адресам РФ.

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

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

Регистрация  - 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/iplocate/address.
  • Метод – GET.
  • Формат ответа – json.
  • Кодировка -  UTF-8.
  • Заголовок запроса - Content-Type –  application/json.
  • Заголовок запроса - Accept –  application/json.
  • Заголовок запроса - Authorization - Token 1d01d91d91d91d91d9f1d91d9_____ - API-ключ из личного кабинета.

 Заданный IP передается как параметр в URL.

 Пример запроса: https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip=178.219.186.12.

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

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

{
    "location": {
        "value": "г Москва",
        "unrestricted_value": "101000, г Москва",
        "data": {
            "postal_code": "101000",
            "country": "Россия",
            "country_iso_code": "RU",
            "federal_district": "Центральный",
…
            "history_values": null,
            "unparsed_parts": null,
            "source": null,
            "qc": null
        }
    }
}

Если город не удалось определить, ответ будет таким:

{ "location": null }

В процедуре парсинга выводиться следующие поля Город, Регион, Округ, Страна (iso код), Координаты.

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

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

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

IF LEN( ISNULL( @IPStr , '' ) ) = 0
	 SET @IPStr = N'178.219.186.12'

DECLARE @apiUrl1 		nvarchar(max) = '' 		-- Финальная строка для отправки  -- ФАКТИЧЕСКИ ЭТО Url
DECLARE @jsonRequest1	nvarchar(max) = '' 	    -- текст json-объекта
-- IP передается как параметр в Url
SET     @apiUrl1  = 'https://suggestions.dadata.ru/suggestions/api/4_1/rs/iplocate/address?ip='+ISNULL( @IPStr, '' )

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

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


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


END

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

	@username nvarchar(32)
AS
BEGIN
    -- ОТЛАДКА
   	insert into as_trace ( header, text, username, code , created )  values( 'LEN @response ', LEN ( @response ) , @username, 'api_daData_IPLocation_response' , GETDATE() )
	insert into as_trace ( header, text, username, code , created )  values( '@response - 1    , 1024 ', SUBSTRING ( @response , 1    , 1024 ) , @username, 'api_daData_IPLocation_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
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Строка @response не является JSON!' AS  Response
        RETURN
    END

    IF LEN( ISNULL( @response  , '' ) ) =0
    BEGIN
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Получена срока @response нулевой длины!' AS  Response
        RETURN
    END

    DECLARE @commonResult NVARCHAR(MAX)  = N''
    SET  @commonResult =  (SELECT JSON_QUERY(@json1, '$.location') ) -- строка массива location

    IF LEN( ISNULL(  @commonResult  , '' ) ) =0
    BEGIN
        SELECT 'Ошибка!' AS Msg, 0 Result, 'Ошибка! Город не удалось определить!' AS  Response
        RETURN
    END

-- Город 	Москва -- Регион 	Москва -- Округ 	Центральный федеральный округ   -- Страна 	/RU

    DECLARE @value_Address 	NVARCHAR(MAX)  = N'' -- Адрес одной строкой
    DECLARE @postal_code 	NVARCHAR(MAX)  = N'' -- Индекс
    DECLARE @country 		NVARCHAR(MAX)  = N'' -- Страна -- "country": "Россия"
    DECLARE @country_iso_code NVARCHAR(MAX)= N'' -- Страна 	RU
    DECLARE @city 			NVARCHAR(MAX)  = N'' -- Город 	Москва
    DECLARE @region		    NVARCHAR(MAX)  = N'' -- Регион 	Москва
    DECLARE @district 		NVARCHAR(MAX)  = N'' -- Округ 	Центральный федеральный округ    "Центральный"
    DECLARE @lat 			NVARCHAR(MAX)  = N'' -- data_geo_lat
    DECLARE @lon 			NVARCHAR(MAX)  = N'' -- data_geo_lon

SELECT  @value_Address = ISNULL( Query.value_Address    ,'' )
	  , @postal_code   = ISNULL( Query.data_postal_code ,'' )
	  , @country       = ISNULL( Query.data_country 	,'' )
	  , @country_iso_code = ISNULL( Query.data_country_iso_code,'' )
      , @city          = ISNULL( Query.data_city ,'' )
      , @region	       = ISNULL( Query.data_region_with_type ,'' )
      , @district      = ISNULL( Query.data_federal_district ,'' )
      , @lat           = ISNULL( Query.data_geo_lat 	     ,'' )
      , @lon           = ISNULL( Query.data_geo_lon          ,'' )

FROM OPENJSON(@json1, N'$.location') -- Зашли в массив  , далее в WITH считаем , что адреса уже внутри массива
WITH (
       value_Address		VARCHAR(200)    N'$.value' -- Адрес одной строкой (как показывается в списке подсказок)
     , data_postal_code		VARCHAR(200)    N'$.data.postal_code'		-- Индекс
     , data_country			VARCHAR(200)    N'$.data.country'			-- "country": "Россия"
     , data_country_iso_code VARCHAR(200)   N'$.data.country_iso_code'	-- "country_iso_code": "RU",
     , data_city			VARCHAR(200)    N'$.data.city'
     , data_region_with_type VARCHAR(200)   N'$.data.region_with_type'	-- "region_with_type": "Москва",
     , data_federal_district VARCHAR(200)   N'$.data.federal_district'	-- "federal_district": "Центральный",
     , data_geo_lat			VARCHAR(200)    N'$.data.geo_lat'
     , data_geo_lon			VARCHAR(200)    N'$.data.geo_lon'
    ) AS Query

-- Город 	Москва -- Регион 	Москва -- Округ 	Центральный федеральный округ   -- Страна 	/RU

	-- SELECT 1
	select 'Ok' Msg
         , 1 Result
         -- , @response Response -- ТАК при вызов из формы вернет оригинальный  @response !!!
         , 'Город: '  +IIF ( @city = ''    , '' , @city )
          +'; Регион: '+IIF ( @region = ''  , '' , @region )
          +'; Округ: ' +IIF ( @district = '', '' , @district )
          +'; Страна: '+IIF ( @country = '' , '' , @country )  + '-' +IIF ( @country_iso_code  = '' , '' ,@country_iso_code  )
          +'; Координаты : '+IIF ( @lat = '' , '' ,@lat ) + ' ' +IIF ( @lon = '' , '' ,@lon )  + '.'
         AS Response

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

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

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

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

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